STL コンテナではすべてのコンテンツがコピー可能で割り当て可能である必要があるため、コピー不可能なオブジェクトを操作する際に推奨されるイディオムは何ですか?
実際、C++11 では、オブジェクトが Movable である必要があります。メソッドのおかげで、特定の操作のみが割り当て可能である必要がありますemplace_*
。
2 つの異なるアプローチを考えることができます。
オブジェクトではなく (スマート) ポインターを STL コンテナーに格納します。
STL コンテナーを取り除き、独自のリストを実装します (たとえば、各オブジェクトには次のオブジェクトへのポインターを含める必要があります)。
2つのアプローチは確かに実現可能です。
C++11 では、std::unique_ptr<YourObject>
要素を含む STL コンテナーがおそらく最良のオプションです。どこまでもスタンダードです。ノードとそれらが指す要素は異なるメモリ領域になるため、ノードベースのコンテナにはわずかなパフォーマンスの問題が発生する可能性があります。しかし、それは一般的に知覚できません。
それが認識できる場合、または C++11 を使用できない場合は、オブジェクトをフックで拡張して、たとえばリストに配置できるようにすることで構成される、侵入型コンテナーについて学習する必要があります。これには明らかに Boost ライブラリがあります: Boost.Intrusive。
あなたが言った非可動?
オブジェクトを動かすべきではないと主張するほとんどのデザインに正直に異議を唱えます。移動に関する唯一の問題は、オブジェクトの同一性と、移動元のオブジェクトへのポインターを無効にするという潜在的な問題に関連しています (したがって、後ろにぶら下がっているポインターが生きています)。これは通常、スマート ポインターや Factory アプローチによって解決できます。