STL ベクトル要素のストレージの連続性
STL ベクトルを操作する場合、要素のメモリ レイアウトを理解することが不可欠です。よくある疑問が生じます: ベクトルのサイズが変更された場合、その要素がメモリ内に連続して格納されていると安全に仮定できますか?
分析
C 03 標準 (23.2) .4.1) は次の答えを提供します:
The elements of a vector are stored contiguously, meaning that if v is a vector where T is some type other than bool, then it obeys the identity &v[n] == &v[0] + n for all 0 <= n < v.size().
簡単に言うと、これは次のことを意味します。ベクトルの最初の要素 (&v[0]) のアドレスは、その n 番目の要素 (&v[n]) のアドレスに n のオフセットを加えたものに等しくなります。これは、ブール値以外のデータ型を含むベクトルに適用されます。
例
次のコードを考えてみましょう。
vector<char> vc(100); // do some stuff with vc vc.resize(200); char* p = &vc[0]; // do stuff with *p
標準に従って、ベクトルのサイズを変更した後、p に格納されたアドレスにより、ベクトル。これは、ベクトルの要素がメモリに次々と格納されることが保証されており、効率的な走査とアクセスが可能であるためです。
注意
ただし、重要です。ベクトルに要素を追加すると、そのストレージが再割り当てされる可能性があることに注意してください。これにより、ベクター要素への既存のポインターやイテレーターが無効になる可能性があるため、ベクターを操作するときはこれを考慮することが不可欠です。
以上がSTL ベクトル要素はサイズ変更後もメモリ内に連続したままになりますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。