使用std :: vector构造一个对象并使用它

时间:2010-11-16 13:44:15

标签: c++ stl

我需要避免复制和破坏由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

4 个答案:

答案 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();

但请考虑为什么需要这样做。分析是否真的表明复制周围的对象太昂贵了?它们是不可复制的吗?