5

私が理解している限り、dequeの背後にある動機は、ランダムアクセスコンテナに効率的なを提供することpush_frontです。

dequeと比較した場合のvectorの一般的に引用される利点には、より高速なトラバーサルとat()が含まれますが、連続したメモリが保証されるため、ほとんどの場合C互換性があります。Dequeは、それぞれが多数の値を保持するメモリのチャンクのコレクションであるため、そうではありません。

よくわかりません。dequeがベクトルのように構築されていないのに、0インデックスの後に予約されているメモリに加えて、インデックスの前にメモリが予約されているのはなぜsize-1ですか?これにより、連続したメモリが保証され、効率が向上push_frontし、イテレータを逆参照する際の追加の間接参照が回避されます。

挿入中のシフトを最小限に抑えるために、シフトされる含まれる値は挿入ポイントによって異なります。nの前にあるインデックスに挿入する場合は、値を左size()/2にシフトします。nそれ以外の場合は、の後に値を右にシフトしますn

dequeが値の配列のコレクションであり、1つの大きな配列ではないほど重要であることが、私が見逃したことは何ですか?

4

1 に答える 1

8

ウィキペディアによると、あなたが説明しているのは、少なくとも一般的には、確かに1つの可能な実装です。

std::dequeただし、C ++標準では、 ;の実装としてこれを本質的に禁止する要件が課されています。[deque.modifiers]の状態:

deque ...のいずれかの端に挿入しても、dequeの要素への参照の有効性には影響しません。

(@BenjaminLindleyに感謝します!)

于 2013-02-10T00:09:37.583 に答える