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 サイトの他の関連記事を参照してください。