簡體   English   中英

在容器之間移動對象而不復制開銷

[英]move objects between containers without copying overhead

我有一個對象指針的全局向量,我正在生成相同類型的對象,並將它們放入forloop內的向量中。 那是:

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

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

我的問題是如何在不復制開銷的情況下將objVector中的對象“移動”到ptrVector中?

簡而言之,你不能用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);})

但是,如果ptrVector具有獨占或共享所有權,我建議將ptrVector設為std::vector<std::unique_ptr<object>>std::vector<std::shared_ptr<object>>而不是使用原始指針。它分別指向的對象。

簡短的回答 - 你不能。

ptrVector包含指針,而不是object實例,因此對象不能通過移動它們或其他方式“進入”它,有或沒有復制開銷。

如果首先交換objVector本身或者(在C ++ 11中)移動到vector<object>另一個實例,那么“in” objVector對象只能在向量上調用clear()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM