C ++ STL容器和中
请考虑以下几点:
class CMyClass
{
public:
CMyClass()
{
printf( "Constructorn" );
}
CMyClass( const CMyClass& )
{
printf( "Copy constructorn" );
}
};
int main()
{
std::list<CMyClass> listMyClass;
listMyClass.resize( 1 );
return 0;
}
它产生以下输出:
构造函数
复制构造函数
现在我的问题是:我如何避免复制构造函数? 或者换句话说:如何在STL容器内创建对象而不需要进行不必要的复制操作。 有什么方法可以使用默认构造函数进行“就地”构建?
更新 - 到目前为止的答案:
智能指针对于我的应用程序来说是一种矫枉过正。 但我真的很想知道为什么不能这样做。 这似乎是想要做的显而易见的事情。 任何其他想法? 如果它有效,我甚至会接受一个讨厌的黑客攻击......
解
我想我从这里提出的所有评论和答案中找到了解决我的问题的解决方案。 解决的办法是构造一个空的对象并保留它,以便稍后使用它来制作干净的副本。 然后你可以使用一个引用的方法(比如push_back或insert)。 这仍然会为插入的每个新对象调用复制构造函数,但至少它不是默认构造函数和复制构造函数:
int main()
{
CMyClass Empty;
std::list<CMyClass> listMyClass;
for ( int c=0; c<10; ++c )
{
listMyClass.push_back( Empty );
}
return 0;
}
按照设计,所有C ++标准库容器都会存储副本。 因此,如果您希望将值存储在容器中,则无法避免对复制构造函数的调用 - 唯一的出路是存储指针。 如果您想减轻复制的开销,请调查引用计数的使用。
使用指针
std::list<CMyClass*> listMyClass;
对不起,目前没有使用std :: list和类似的容器。 (但是如果你真的需要这个,你可以编写你自己的稍有不同的容器,并且仍然遵循STL接口的其余部分。)
但是,您不必使用默认的ctor:
std::list<CMyClass> listMyClass;
listMyClass.resize(1, obj_to_copy_from);
如:
std::list<CMyClass> listMyClass;
listMyClass.resize(1, CMyClass(use, specific, ctor));
调整大小看起来像:
void list<T>::resize(size_type new_size, T copy_from = T());
它默认创建一个新对象(使用默认的ctor)。
链接地址: http://www.djcxy.com/p/39579.html