ベクトルの Push_Back と参照の有効性
push_back を使用して要素をベクトルに挿入する場合、既存の要素への参照に対する潜在的な影響を考慮することが重要です。 。ここでは、特定の条件下での Push_back の安全性を検証します。
次の例を考えてみましょう:
<code class="cpp">vector<int> v; v.push_back(1); v.push_back(v[0]);</code>
この場合、2 番目の Push_back が再割り当てをトリガーする場合、v[0] のアドレスはベクトルの移動により無効になります。これは潜在的な安全上の問題を引き起こします。
これを軽減するには、次のリザーブを使用できます。
<code class="cpp">vector<int> v; v.push_back(1); v.reserve(v.size() + 1); v.push_back(v[0]);</code>
この変更されたコードでは、リザーブにより、割り当てられたメモリが新しい要素に対応するのに十分であることが保証されます。
C 標準では、潜在的な欠陥としてこれと同様の懸念に対処していることは注目に値します。ただし、決議では、これらの操作は許可された動作であると結論付けています:
v.insert(v.begin(), v[2]);
その理論的根拠は、標準ではそのような操作の成功を暗黙的に許可しており、ベクトルが大規模なコレクションの管理と操作のための信頼できるデータ構造であり続けることが保証されているということです。
以上がVector Push_Back は要素参照に対して安全ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。