7

タイプのオブジェクトを格納したいタイプclass Cのメンバー変数を持つaを想像してみてください。内のオブジェクトを追加または削除する2つの関数があります。 また、オブジェクトのコレクションを読み取る必要があるため、の消費者がアクセスできるようにする必要があります。コレクションの外部リーダーにはコレクションを変更する手段がないため、オブジェクトはによってのみ所有されます。m_MyListstd::vectorMyClassCm_MyListm_MyListCMyClassMyClassC

今私の質問:C ++ 11スタイルで、ベクトルに格納するのに最適なTは何ですか?可能性は次のようです。

  • std::vector<MyClass>
  • std::vector<MyClass*>
  • std::vector<unique_ptr<MyClass>>、をstd:moveに押し込むために使用unique_ptrするvector
4

2 に答える 2

13

MyClassオブジェクトがによって所有されている場合C、最良のオプションは最も単純です。

std::vector<MyClass>

ここで使用するために私が見ることができる唯一の理由はstd::unique_ptrs、ポリモーフィズムの基本クラスへのポインターを保持する必要がある場合です。この場合、unique_ptrsは、ベクターの破棄時にリソースを解放するという目的を果たします。ただし、Cインターフェイスは所有権をクライアントに譲渡しないでください。

于 2012-05-31T08:19:10.993 に答える
12

Cがオブジェクトを所有している場合、生のポインタ(std::vector<MyClass*>)は正しくありません。他の2つは、次のトレードオフと非常によく似ています。

  • std::vector<MyClass>-MyClassがコピー可能および/または移動可能である必要があります
  • std::vector<unique_ptr<MyClass>>-(追加の)動的割り当てが必要

コンテナで実行されている操作の種類も関連している可能性があります。極端な例を挙げると、MyClassが大きく、コンテナが繰り返しシャッフルされているunique_ptr場合は、より適切な選択です。

于 2012-05-31T08:21:54.220 に答える