本当に簡単な質問です。ベクトルの前面に追加したり削除したりするとき、なぜこの変更に対応するためにすべての要素をシフトする必要がありますか?ベクトルにインデックスを付けるときに与えられたインデックスを変更する代わりにオフセットを使用すると、この問題は解決します。これにより、(最大で)2つの連続したデータブロックのメモリが得られる可能性がありますが、これは線形演算を一定時間に減らすために支払う小さな値段のようです。なぜstd :: vectorはオフセットを使用しませんか?
['A', 'B', 'C', _, _, _, _, _] offset is 0, 4th through 8th position unused.
push_front('M')
['A', 'B', 'C, _, _, _, _, 'M'] offset is -1
、その後
operator[](size_t index) {
return backing_array[(index + offset) % size]
}
のインデックスを作成するとき、私はこれがデータの1純粋な連続したブロックであってよいが、1から動いていない可能性がありますを意味し得る:
はここで、可能な限り明確にすることの例です2への一定の時間のプッシュとポップのフロントと引き換えに、巨大な取引のようには見えません。
これは['std :: deque'](http://en.cppreference.com/w/cpp/container/deque)のためのものです。 –
ベクトルは中間の要素を削除するために作成されません。あなたはそれを行うことができますが、より良いコンテナ(リンクされたリストなど)があります。ベクトルは、要素が連続したメモリに格納されることを保証します – user463035818
理由の1つは、 'std :: vector :: operator []'を使うたびに、そのオフセットをインデックスに追加する必要があるということです。 – 101010