ホームページ >バックエンド開発 >C++ >STL ベクトル要素はサイズ変更後もメモリ内に連続したままになりますか?

STL ベクトル要素はサイズ変更後もメモリ内に連続したままになりますか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-16 07:26:03581ブラウズ

Do STL Vector Elements Remain Consecutive in Memory After Resizing?

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 &amp;v[n] == &amp;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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。