2012-02-11 50 views
4

我有一個全局的對象指針向量,我生成相同類型的對象並將它們放入forloop中的向量中。 那就是:容器之間移動對象而不復制開銷

vector<object * > ptrVector; 
vector<object > objVector; 

for (; ;) 
{ 
    getElements(objVector); 
    calcualte_with(objVector); 
    objVector.clear(); 
} 

我的問題是我怎麼能「動」對象objVector到ptrVector而不復制開銷?

回答

3

總之,你不能用C++ 98/C++ 03。 objVector中的對象由objVector分配和擁有,並且當你毀壞或清除它時,這些物品也將被破壞。

使用C++ 11,您可以爲您的對象實現移動構造函數,並使用已從objVector中的對象移動構建的新對象填充ptrVector。一般來說,移動構造函數會移動對象的私有成員,避免由對象擁有的任何大型堆分配數據結構的副本,這通常非常便宜。

要做到這一點,你會使用類似std::transform(begin(objVector), end(objVector), std::back_inserter(ptrVector), [](object& o){return new object(std::move(o);})

不過,我建議你做的std::vector<std::unique_ptr<object>>std::vector<std::shared_ptr<object>>而不是使用原始指針如果ptrVector有對象的獨佔或共享所有權指向ptrVector它分別。

+0

或更好:boost :: ptr_container – Guillaume07 2012-02-11 18:53:32

3

簡短的答案 - 你不能。

ptrVector包含指針,而不是object的實例,因此通過移動它們或其他方式,無論是否有複製開銷,對象都不可能「進入」它。

對象「處於」 objVector只能生活超出clear()被稱爲對向量如果objVector本身首先與或(在C++ 11)移動到vector<object>另一個實例交換。

+0

因此,在清除objVector之前,沒有辦法將objVector中的對象「移動」到堆中,並將它們的指針放入ptrVector中? – ablimit 2012-02-11 18:42:56

+0

@ablimit:好吧,在C++ 11中,一個移動構造函數可以用來在堆上構建一個對象,或者在C++ 03中,您可以創建一個堆對象,然後將其與矢量元素交換。這可能比複製要便宜,具體取決於類「對象」,但它仍然是與原始對象不同的地址處的全新分配。移動/交換整個矢量是「釋放」對象的唯一方式,而不是創建一個類似於舊對象的新對象。 – 2012-02-11 18:54:36