どのstd::vector
データ構造を使用して、どのように実装されますか?私が書くとき
void f(int n) {
std::vector<int> v(n);
...
}
ベクトルv
はスタックに割り当てられていますか?
vector
オブジェクトはスタックに割り当てられ、ヒープ上の要素の先頭へのポインターを内部的に含みます。
ヒープ上の要素により、vector
クラスは必要に応じて拡大および縮小できます。
スタックvector
上にある間、スコープ外に出るときにオブジェクトが破壊されるという利点があります。
あなたの[]
質問に関して、vector
クラスは演算子をオーバーロードします。私はあなたがするときそれが基本的にこのようなことをしている[]
と内部的に言うでしょう:array[1]
return *(_Myfirst+ (n * elementSize))
vector
が内部ヒープの開始を追跡する場所_Myfirst
。
いっぱいにvector
なり始めると、より多くのメモリが割り当てられます。一般的な方法は、毎回必要なメモリの量を2倍にすることです。
次のメンバーを含むvector
から継承することに注意してください。_Vector_val
pointer _Myfirst; // pointer to beginning of array
pointer _Mylast; // pointer to current end of sequence
pointer _Myend; // pointer to end of array
_Alty _Alval; // allocator object for values
あなたv
は自動メモリに割り当てられます。(一般にスタックとして知られています、はい)
実装の詳細は指定されていませんが、最も一般的には、以前の割り当てで保持できるよりも多くの要素を追加しようとするとサイズが変更される動的配列を使用して実装されます。
この標準では、インターフェース(どのメソッドが必要か)と実行時間の境界のみが指定されています。
vector
はテンプレートであるため、実装が表示されます。ファイルを見つけて検査<vector>
を開始してください。
void f(int n) {
std::vector<int> v(n);
...
}
上記のベクトルには自動保存期間があり、スタックに割り当てられます。ただし、ベクターが管理するデータ配列はヒープに割り当てられます。
ベクトルの内部は実装固有ですが、一般的な実装には3つのポインターが含まれます。配列の開始、ベクトルのサイズ、およびベクトルの容量を追跡するために1つずつ。