std::list
いくつかのまれなケースで役立ちます。
ただし、C++ 順次コンテナーの一般的なルールは、「アルゴリズムに互換性がある場合は を使用しますstd::vector
。アルゴリズムに互換性がない場合は、アルゴリズムを変更して を使用できるようにするstd::vector
」です。
std::list
例外はありますが、より良い選択である理由を徹底的にリストする試みは次のとおりです:
(A) コンテナーの中央に挿入する必要がある場合、および (B) メモリ内の各オブジェクトの場所を安定させる必要がある場合。要件 (B) は、通常、要素へのポインターで構成される非安定コンテナーを使用することで取り除くことができるため、これは を使用する強い理由にはなりませんstd::list
。
(A) コンテナーの途中で挿入または削除する必要がある場合 (B) コンテナーを反復する必要がある場合よりも桁違いに頻繁に。これも極端なケースです。 から削除する要素を見つけるにはlist
、通常、反復する必要があります。
につながる
(A)コンテナの途中で挿入または削除する必要があり、(B)他のすべての要素へのイテレータが有効なままである必要があります。これは、ケース 1 とケース 2 の隠れた要件になります。永続的なイテレータがない場合、繰り返しよりも頻繁に削除または挿入するのは難しく、イテレータとオブジェクトの安定性は非常に関連しています。
最後のケースは、かつて使用する理由だったスプライシングのケースですstd::list
。
C++03 では、すべてのバージョンのstd::list::splice
(理論上) O(1) 時間で実行できました。ただし、非常に効率的な形式のO(n) 操作がsplice
必要です。size
C++11 ではO(1) でsize
ある必要があるため、の極端な効率は、「他のリスト全体をスプライシングする」場合と「サブリストを自己スプライシングする」場合に限定されます。単一要素スプライスの場合、これは単に挿入と削除です。サブ範囲スプライスの場合、コードはスプライス内のすべてのノードにアクセスして、O(1) として維持するためにそれらをカウントする必要があります(自己スプライシングを除く)。list
splice
size
list
したがって、全体スプライスまたは自己リスト部分範囲のみを実行している場合は、splice
これらlist
の操作を他の非リスト コンテナーよりもはるかに高速に実行できます。