2012-02-11 12 views
4

オブジェクトポインタのグローバルベクトルがあり、同じタイプのオブジェクトを生成してforループ内のベクトルに入れています。ある :オーバーヘッドをコピーせずにコンテナ間でオブジェクトを移動する

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

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

私の質問は、私はオーバーヘッドをコピーせずにptrVectorにobjVector内のオブジェクトを「動かす」ことができる方法ですか?

答えて

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);})

のようなものを使用したいptrVectorがが指すオブジェクトの排他的または共有の所有権を持っている場合、私はptrVectorに代わりに生のポインタを使用してのstd::vector<std::unique_ptr<object>>またはstd::vector<std::shared_ptr<object>>を行うことをお勧めしたいことを行うには

それはそれぞれ。

+0

以上:boost :: ptr_container – Guillaume07

3

短い回答 - できません。

ptrVectorにはポインタが含まれており、objectのインスタンスではないため、オブジェクトはコピーオーバーヘッドの有無にかかわらず移動または移動することができません。 objVector自体が第一または(11 C++で)vector<object>の別のインスタンスに移動スワップされた場合にのみclear()超えて生きることができるobjVector「に」ある

オブジェクトは、ベクトルに呼び出されます。

+0

objVectorをクリーンアップする前に、objVector内のオブジェクトをヒープに「移動」してポインタをptrVectorに挿入する方法はありませんか? – ablimit

+0

@ablimit:C++ 11では、ムーブコンストラクタを使用してヒープ上にオブジェクトを構築することができます。また、C++ 03では、ヒープオブジェクトを作成してベクトルの要素でスワップできます。これはクラス 'オブジェクト 'に応じて、コピーよりも安いかもしれませんが、元のオブジェクトとは異なるアドレスに新しい割り当てが行われています。古いオブジェクトに似た新しいオブジェクトを作成するのではなく、オブジェクト全体を「解放する」唯一の方法は、ベクトル全体を移動/スワップすることです。 –

関連する問題