请考虑以下事项:
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 容器内创建对象而无需进行不必要的复制操作。有没有办法使用默认构造函数进行“就地”构造?
更新 - 到目前为止的答案:
- 这是不可能的
- 使用指针或智能指针
反而。
智能指针对于我的应用程序来说是一种杀伤力。但我真的很想知道为什么这不能做到。这似乎是一件显而易见的事情。还有其他想法吗?如果有效的话我什至会接受令人讨厌的黑客......
Solution
我想我刚刚从这里提出的所有评论和答案中找到了解决我的问题的方法。解决方案是构造一个空对象并保留它,其唯一目的是稍后使用它来制作干净的副本。然后您可以使用采用引用的方法之一(例如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++ 标准库容器都存储副本。因此,如果您希望在容器中存储值,则无法避免对复制构造函数的调用 - 唯一的出路是存储指针。如果您想减少复制的开销,请研究引用计数的使用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)