102

コンテナをスタックで使用するために必要な操作は次のとおりです。

  • 戻る()
  • push_back()
  • pop_back()

デフォルトのコンテナーがベクトルではなく両端キューであるのはなぜですか?

push_front() が効率的な操作になるように、再割り当てを deque して front() の前に要素のバッファーを与えないでください。これらの要素は、スタックのコンテキストで使用されることはないため、無駄になっていませんか?

ベクトルの代わりにこの方法で両端キューを使用してもオーバーヘッドがない場合、priority_queue のデフォルトが両端キューではないのはなぜですか? (priority_queue には、front()、push_back()、および pop_back() が必要です - 基本的にスタックの場合と同じです)


以下の回答に基づいて更新されました。

deque が通常実装される方法は、固定サイズ配列の可変サイズ配列であるようです。これにより、ベクトル (再割り当てとコピーが必要) よりも高速に成長するため、要素の追加と削除がすべてのスタックのようなものでは、おそらく deque の方が適しています。

削除と挿入のたびに pop_heap() または push_heap() を実行する必要があるため、priority_queue には大量のインデックス作成が必要です。とにかく、要素の追加はまだ償却定数であるため、これはおそらくベクトルをより良い選択にします。

4

2 に答える 2

80

コンテナーが大きくなるにつれて、ベクターの再割り当てでは、すべての要素を新しいメモリ ブロックにコピーする必要があります。両端キューを拡張すると、新しいブロックが割り当てられ、それがブロックのリストにリンクされます。コピーは必要ありません。

もちろん、必要に応じて別のバッキング コンテナーを使用するように指定することもできます。そのため、あまり大きくならないことがわかっているスタックがある場合は、必要に応じて両端キューの代わりにベクターを使用するように指示してください。

于 2008-09-19T14:58:03.760 に答える
12

vector と deque の相対的なメリットについては、 Herb Sutter のGuru of the Week 54を参照してください。

priority_queue と queue の間の不一致は、単に別の人がそれらを実装したことだと思います。

于 2008-09-19T15:28:25.403 に答える