web-dev-qa-db-ja.com

dequeとlist STLコンテナの違いは何ですか?

2つの違いは何ですか?方法はすべて同じです。したがって、ユーザーにとっては同じように機能します。

あれは正しいですか??

76
Lazer

(日付は付けられていますが、非常に便利です) SGI STL の概要 deque

Dequeはベクターに非常に似ています。ベクターのように、要素へのランダムアクセス、シーケンスの最後での要素の一定時間の挿入と削除、および中央での要素の線形時間の挿入と削除をサポートするシーケンスです。

Dequeがvectorと異なる主な方法は、dequeがシーケンスの開始時に要素の一定時間の挿入と削除もサポートすることです。さらに、dequeにはvectorのcapacity()およびreserve()に類似したメンバー関数はなく、それらのメンバー関数に関連付けられている反復子の有効性に関する保証も提供しません。

同じサイトの list の概要は次のとおりです。

リストは二重にリンクされたリストです。つまり、前方または後方の両方のトラバース、および開始または終了、または途中での(償却された)一定時間の挿入と削除をサポートするシーケンスです。リストには、挿入とスプライシングによって要素をリストするイテレータが無効にならず、削除しても削除される要素を指すイテレータのみが無効になるという重要なプロパティがあります。イテレータの順序は変更できます(つまり、list :: iteratorは、リスト操作の前とは異なる先行操作または後続操作を持つ場合があります)が、イテレータ自体は無効化されず、無効化されない限り別の要素を指すようになりませんまたは突然変異は明示的です。

要約すると、コンテナにはルーチンが共有されている可能性がありますが、これらのルーチンの時間保証はコンテナごとに異なります。これは、これらのコンテナのどれをタスクに使用するかを検討する際に非常に重要です:howコンテナが最も頻繁に使用されることを考慮してください(たとえば、挿入/削除よりも検索)を使用すると、適切なコンテナに移動できます。

48
fbrereto

違いをリストします。

  • Dequeは、要素を動的配列で管理し、ランダムアクセスを提供し、ベクトルとほぼ同じインターフェースを持ちます。
  • リストは、その要素を二重リンクリストとして管理し、ランダムアクセスを提供しません。

  • Dequeは、末尾と先頭の両方で高速な挿入と削除を提供します。中央の要素の挿入と削除は、両端までのすべての要素を移動してスペースを空けたり、隙間を埋めたりするため、比較的低速です。
  • Listでは、両端を含む各位置での要素の挿入と削除が高速です。

  • Deque:先頭または末尾以外の要素を挿入または削除すると、両端キューの要素を参照するすべてのポインター、参照、および反復子が無効になります。
  • リスト:要素を挿入および削除しても、他の要素へのポインター、参照、および反復子は無効になりません。

複雑さ

             Insert/erase at the beginning       in middle        at the end

Deque:       Amortized constant                  Linear           Amortized constant
List:        Constant                            Constant         Constant
110
aJ.

std::list は基本的に二重にリンクされたリストです。

std::deque は、一方で、std::vectorのように実装されます。インデックスごとの一定のアクセス時間、および開始と終了での挿入と削除があり、リストとは劇的に異なるパフォーマンス特性を提供します。

7
Reed Copsey

別の重要な保証は、各コンテナがデータをメモリに保存する方法です。

  • ベクトルは、単一の連続したメモリブロックです。
  • Dequeはリンクされたメモリブロックのセットで、各メモリブロックに複数の要素が格納されます。
  • リストは、メモリに分散された要素のセットです。つまり、メモリ「ブロック」ごとに1つの要素のみが保存されます。

Dequeはtry toのように設計されていることに注意してください。それぞれの欠点はなく、ベクターとリストの両方の利点をバランスさせます。これは、たとえばマイクロコントローラなど、メモリに制限のあるプラットフォームで特に興味深いコンテナです。

メモリストレージ戦略は見過ごされがちですが、特定のアプリケーションに最適なコンテナを選択することが最も重要な理由の1つであることがよくあります。

4

いいえ。両端キューは、前面と背面でのO(1)の挿入と削除のみをサポートします。たとえば、ラップアラウンドのベクターで実装できます。 O(1)ランダムアクセスも保証されるため、二重リンクリストを(ちょうど)使用していないことを確認できます。

4
Jonathan Graehl

パフォーマンスの違いは、他の人によって十分に説明されています。オブジェクト指向プログラミングでは、類似または同一のインターフェースが一般的であることを追加したかっただけです。これは、オブジェクト指向ソフトウェアを作成する一般的な方法論の一部です。 2つのクラスが同じインターフェースを実装しているという理由だけで、2つのクラスが同じように機能すると仮定する必要があります。

2
Lee B