Sté*_*ane 161 c++ pointers stl
从头开始设计新系统.我将使用STL来存储某些长寿命对象的列表和地图.
问题:我是否应该确保我的对象具有复制构造函数并在我的STL容器中存储对象的副本,或者通常更好地自己管理生命和范围并将指针存储到我的STL容器中的那些对象?
我意识到这在细节方面有点短暂,但我正在寻找"理论上"更好的答案,如果它存在,因为我知道这两种解决方案都是可能的.
使用指针的两个非常明显的缺点:1)我必须在超出STL的范围内管理这些对象的分配/释放.2)我无法在堆栈上创建临时对象并将其添加到我的容器中.
还有什么我想念的吗?
Tor*_*ing 67
因为人们正在考虑使用指针的效率.
如果您正在考虑使用std :: vector并且如果更新很少并且您经常迭代您的集合并且它是非多态类型存储对象"副本"将更有效,因为您将获得更好的引用位置.
Otoh,如果更新是常见的存储指针将节省复制/重定位成本.
Nic*_*dad 46
这真的取决于你的情况.
如果您的对象很小,并且对象的副本是轻量级的,那么在我看来将数据存储在stl容器中是简单易行的,因为您不必担心生命周期管理.
如果对象很大,并且默认构造函数没有意义,或者对象的副本很昂贵,那么使用指针存储可能就是要走的路.
如果您决定使用指向对象的指针,请查看Boost指针容器库.此boost库包装所有STL容器以与动态分配的对象一起使用.
每个指针容器(例如ptr_vector)在将对象添加到容器时获取对象的所有权,并为您管理这些对象的生命周期.您还可以通过引用访问ptr_容器中的所有元素.这可以让你做的事情
class BigExpensive { ... }
// create a pointer vector
ptr_vector<BigExpensive> bigVector;
bigVector.push_back( new BigExpensive( "Lexus", 57700 ) );
bigVector.push_back( new BigExpensive( "House", 15000000 );
// get a reference to the first element
MyClass& expensiveItem = bigList[0];
expensiveItem.sell();
Run Code Online (Sandbox Code Playgroud)
这些类包装STL容器并使用所有STL算法,这非常方便.
还有用于将容器中指针的所有权转移给调用者的设施(通过大多数容器中的释放功能).
EML*_*EML 22
对不起,在活动结束后3年内跳了一下,但这里有一个警示...
在我的上一个大项目中,我的中心数据结构是一组相当简单的对象.大约一年的项目,随着需求的发展,我意识到对象实际上需要是多态的.经过几周的困难和讨厌的脑外科手术将数据结构修复为一组基类指针,并处理对象存储,转换等所有附带损害.我花了几个月的时间才说服自己新代码正在运行.顺便说一下,这让我想到了C++的对象模型设计得如何.
在我目前的大项目中,我的中心数据结构是一组相当简单的对象.大约一年的项目(恰好是今天),我意识到对象实际上需要是多态的.回到网上,找到了这个帖子,并找到了Nick的Boost指针容器库的链接.这正是我上次要写的所有内容,所以这次我会试一试.
无论如何,道德,对我来说:如果你的规范不是100%一成不变的话,那就去寻找指针,你可能会在以后节省很多工作.
Bra*_*nan 19
为什么不充分利用两个世界:做一个智能指针容器(如boost::shared_ptr或std::shared_ptr).您不必管理内存,也不必处理大型复制操作.
Gre*_*ers 11
通常将对象直接存储在STL容器中是最好的,因为它最简单,最有效,并且最容易使用该对象.
如果您的对象本身具有不可复制的语法或者是抽象基类型,则需要存储指针(最简单的方法是使用shared_ptr)