8

STL コンテナではすべてのコンテンツがコピー可能で割り当て可能である必要があるため、コピー不可能なオブジェクトを操作する際に推奨されるイディオムは何ですか?

2 つの異なるアプローチを考えることができます。

  1. オブジェクトではなく (スマート) ポインターを STL コンテナーに格納します。

  2. STL コンテナーを取り除き、独自のリストを実装します (たとえば、各オブジェクトには次のオブジェクトへのポインターを含める必要があります)。

2 番目のアプローチの主な欠点は、デストラクタの実装です (現在のオブジェクトの前に「次の」オブジェクトを再帰的に破棄する必要がありますか?)

4

2 に答える 2

6

STL コンテナではすべてのコンテンツがコピー可能で割り当て可能である必要があるため、コピー不可能なオブジェクトを操作する際に推奨されるイディオムは何ですか?

実際、C++11 では、オブジェクトが Movable である必要があります。メソッドのおかげで、特定の操作のみが割り当て可能である必要がありますemplace_*

2 つの異なるアプローチを考えることができます。

  1. オブジェクトではなく (スマート) ポインターを STL コンテナーに格納します。

  2. STL コンテナーを取り除き、独自のリストを実装します (たとえば、各オブジェクトには次のオブジェクトへのポインターを含める必要があります)。

2つのアプローチは確かに実現可能です。

C++11 では、std::unique_ptr<YourObject>要素を含む STL コンテナーがおそらく最良のオプションです。どこまでもスタンダードです。ノードとそれらが指す要素は異なるメモリ領域になるため、ノードベースのコンテナにはわずかなパフォーマンスの問題が発生する可能性があります。しかし、それは一般的に知覚できません。

それが認識できる場合、または C++11 を使用できない場合は、オブジェクトをフックで拡張して、たとえばリストに配置できるようにすることで構成される、侵入型コンテナーについて学習する必要があります。これには明らかに Boost ライブラリがあります: Boost.Intrusive

あなたが言った非可動?

オブジェクトを動かすべきではないと主張するほとんどのデザインに正直に異議を唱えます。移動に関する唯一の問題は、オブジェクトの同一性と、移動元のオブジェクトへのポインターを無効にするという潜在的な問題に関連しています (したがって、後ろにぶら下がっているポインターが生きています)。これは通常、スマート ポインターや Factory アプローチによって解決できます。

于 2013-04-16T11:56:37.013 に答える
5

私はアプローチ #1 を選択します。つまり、オブジェクトへのスマートポインターを STL コンテナーに格納します。

所有していない生のポインターを STL コンテナーに格納することは問題ありませんが (生のポインターを監視するなど)、所有している生のポインターを格納することは「漏洩」です。代わりにshared_ptr、または新しい C++11を使用してください。unique_ptr

2 については、独自のコンテナーをゼロから作成するには多くの時間とエネルギーが必要であり、商用品質の STL ライブラリの完全な実装の豊富さに、妥当な時間枠で匹敵することはできないと思います。

于 2013-04-16T11:16:02.953 に答える