ホームページ > バックエンド開発 > C++ > STL ベクトルは要素をメモリ内に連続して格納することが保証されていますか?

STL ベクトルは要素をメモリ内に連続して格納することが保証されていますか?

DDD
リリース: 2024-11-25 10:21:11
オリジナル
639 人が閲覧しました

Are STL Vectors Guaranteed to Store Elements Contiguously in Memory?

STL ベクトルでの連続ストレージの確保

C では、要素が追加または削除されると自動的にサイズが変更される動的配列が STL ベクトルによって提供されます。ただし、よくある質問が 1 つ発生します。ベクトルの要素が常にメモリに連続して格納されていると仮定しても安全ですか?

この懸念に対処するには、次のシナリオを検討してください。

vector<char> vc(100);
// Perform operations on vc
vc.resize(200);
char* p = &vc[0];
// Conduct operations using *p
ログイン後にコピー

サイズを変更した後、最初の要素 (*p) のアドレスを使用して、メモリ内のベクトルの残りの要素に順番に確実にアクセスできるかどうかです。ベクトル?

答え: はい、その仮定は有効です。

C 03 標準 (23.2.4.1) に従って、ベクトルの連続ストレージが保証されています。

「ベクトルの要素は連続して格納されます。つまり、v がベクトルで、T がbool 以外の型の場合、すべての 0 <= n < v.size() に対して恒等式 &v[n] == &v[0] n に従います。"

これは、メモリ アドレスがベクトル内の後続の要素の数は、最初の要素のアドレスを要素タイプのサイズだけインクリメントすることで計算できます。言い換えると、要素は線形形式で格納されます。

重要な注意事項:

連続したストレージが保証されていますが、ベクトルが次のことを必要とする場合があることを覚えておくことが重要です。加算操作中に再割り当てが行われるため、ポインタとイテレータが無効になる可能性があります。したがって、ベクター要素へのポインターを操作するときは、この可能性を考慮することが不可欠です。

以上がSTL ベクトルは要素をメモリ内に連続して格納することが保証されていますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート