我需要避免复制和破坏由this answer引起的std :: vector所包含的对象的额外费用。
现在我正在使用它作为std ::指针向量,但我不能在不删除每个对象的情况下调用std :: vector :: clear(),也不能将std :: auto_ptr与std容器一起使用
我想做这样的事情:
vector<MyClass> MyVec;
MyVec.push_back();
MyClass &item = MyVec.back();
这将使用默认构造函数创建一个新对象,然后我可以获得一个引用并使用它。
有关此方向的任何想法吗?
已解决:我使用@MSalters回答@ Moo-Juices建议使用C ++ 0x rvalue引用来获取std :: move语义的优势。基于this article。
答案 0 :(得分:3)
Boost.PointerContainer课程将为您管理内存。特别参见ptr_vector。
使用容器boost::ptr_vector<T>
,您可以使用push_back(new T);
,当容器超出范围时,T
元素的内存将被释放。
答案 1 :(得分:3)
不存储对象,而是存储shared_ptr。这将避免对象复制,并在从向量中删除时自动销毁对象。
答案 2 :(得分:1)
几乎就在那里:
vector<MyClass> MyVec;
MyVec.push_back(MyClass()); // Any decent compiler will inline this, eliminating temporaries.
MyClass &item = MyVec.back();
答案 3 :(得分:0)
你可以使用resize执行此操作,它将默认构建它必须添加到vector
的任何其他对象:
vector MyVec;
MyVec.resize(MyVec.size() + 1);
MyClass &item = MyVec.back();
但请考虑为什么需要这样做。分析是否真的表明复制周围的对象太昂贵了?它们是不可复制的吗?