请考虑以下内容:
它会产生以下输出:
构造函数
拷贝构造函数
现在我的问题是:如何避免使用拷贝构造函数?或者换个方式说:如何在STL容器内创建对象而不必进行不必要的拷贝操作。是否有一种方法可以使用默认构造函数进行“就地”构建?
更新 - 到目前为止的答案:
1.无法实现
2.使用指针或智能指针代替。
对于我的应用程序来说,智能指针有些过度。但我真的很想知道为什么这不能做到。这似乎是一个显而易见的事情。还有其他想法吗?如果有效,我甚至会接受一个恶劣的hack...
解决方案:
我认为我刚刚从这里所有的评论和回答中找到了一个解决方案。解决方案是构造一个空对象并将其保留下来,以便以后仅用于制作干净的副本。然后,您可以使用其中一个采用引用的方法(如push_back或insert)。这仍然会为插入的每个新对象调用拷贝构造函数,但至少不是默认构造函数和拷贝构造函数两者都调用:
class CMyClass
{
public:
CMyClass()
{
printf( "Constructor\n" );
}
CMyClass( const CMyClass& )
{
printf( "Copy constructor\n" );
}
};
int main()
{
std::list<CMyClass> listMyClass;
listMyClass.resize( 1 );
return 0;
}
它会产生以下输出:
构造函数
拷贝构造函数
现在我的问题是:如何避免使用拷贝构造函数?或者换个方式说:如何在STL容器内创建对象而不必进行不必要的拷贝操作。是否有一种方法可以使用默认构造函数进行“就地”构建?
更新 - 到目前为止的答案:
1.无法实现
2.使用指针或智能指针代替。
对于我的应用程序来说,智能指针有些过度。但我真的很想知道为什么这不能做到。这似乎是一个显而易见的事情。还有其他想法吗?如果有效,我甚至会接受一个恶劣的hack...
解决方案:
我认为我刚刚从这里所有的评论和回答中找到了一个解决方案。解决方案是构造一个空对象并将其保留下来,以便以后仅用于制作干净的副本。然后,您可以使用其中一个采用引用的方法(如push_back或insert)。这仍然会为插入的每个新对象调用拷贝构造函数,但至少不是默认构造函数和拷贝构造函数两者都调用:
int main()
{
CMyClass Empty;
std::list<CMyClass> listMyClass;
for ( int c=0; c<10; ++c )
{
listMyClass.push_back( Empty );
}
return 0;
}