2010-11-16 40 views
1

我需要避免複製和破壞由this answer引起的std :: vector所包含的對象的額外成本。使用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

+3

是C++ 0x中給你,讓你可以採取的std ::利用移動語義的選項? – 2010-11-16 13:48:34

回答

1

幾乎有:

vector<MyClass> MyVec; 
MyVec.push_back(MyClass()); // Any decent compiler will inline this, eliminating temporaries. 
MyClass &item = MyVec.back(); 
+0

我已經解決了使用這個和使用C++ 0x std :: move語義(根據這個:http://msdn.microsoft.com/en-us/library/dd293665.aspx) – Vargas 2010-11-17 11:51:12

3

Boost.PointerContainer類將爲您管理內存。特別參見ptr_vector

使用容器boost::ptr_vector<T>,可以使用push_back(new T);,當容器超出範圍時,將釋放內存用於T元素。

+1

儘管和昨天一樣,要小心'push_back(new T);'不能提供例外保證 - 它可以創建T然後拋出對象泄漏(http://stackoverflow.com/questions/4185350/is-it -safe到推回-動態分配對象到矢量/ 4185460)。然而,正如史蒂夫自己昨天所說的,如果你的程序/操作系統的其他部分不健壯,那麼可能不需要這一行更好。 – 2010-11-16 14:05:56

3

不是存儲對象,而是存儲shared_ptr。這將避免對象複製,並且當從矢量中移除時將自動破壞對象。

+1

或者'unique_ptr',如果你知道矢量將擁有指向的對象,它便宜得多。 – rubenvb 2010-11-16 16:57:10

0

你可以調整大小做到這一點,這將默認構造它添加到vector任何其他對象:

vector MyVec; 
MyVec.resize(MyVec.size() + 1); 
MyClass &item = MyVec.back(); 

但不要考慮你爲什麼需要這樣做。分析確實表明,將對象複製過於昂貴?它們是不可複製的嗎?

相關問題