3


0

昨日の夕方、私は自分の仕事にstd

vectorを使っていましたが、この質問が頭に浮かびました。

私はコードを調べようとしましたが失敗しました。 誰かがいくつかのポインタを与えることができますか?

ありがとう、アルン

4 Answer


19


Vectorはその下の連続したメモリを使用するので、本質的に配列と同じようにランダムアクセスを可能にします:それは開始アドレスと要素のサイズを知っていて、そしていくらかのポインタ数学をします。


12


確かに、ここでいくつかのポインタがあります:

int *x, *y;

しかし真剣に、 vector`は内部的には単に配列として実装されています。 これは、配列のようにアクセスできるようにするために、オーバーロードされたインデックス演算子( `[])を提供します。


1


Vectorは一般に動的配列実装[*] …​を使用します。データは常にメモリの連続ブロックに格納されるため、ポインタ演算は(既存の)要素へのO(1)アクセスに使用できます。

効率的な動的配列への秘訣は(あなたがまだそれを知らないと仮定して)、常に少なくとも一定の要因で予約されたストアのサイズを増やすことです(Jerry Coffinのコメントを見てください)。 この結果は、単純化するために係数を2とし、不定数の新しい要素を追加すると、最初の要素がn番目の加算、(2 * n)加算と(4 * n)番目の加算でコピーされることです。そしてその …​

この級数は収束するので、N個の新しい要素を追加するとO(N)時間がかかることを保証できます。 ただし、どのような追加でも既存の要素すべての再割り当てとコピーが必要になる可能性があるため、待ち時間の保証はありません。

[*] 必要なパフォーマンスを達成するための他のメカニズムはわかりません。 誰でも?


1


_ 少なくとも2倍 _

実際、多くの実装では1.5の係数が使用されています。重要なことは、それが1つの要素であるということです。したがって、指数関数的なベクトル成長が得られます。