違いを理解する: std::vector::resize() と std::vector::reserve()
トピックstd::vector::reserve() と std::vector::resize() の比較が議論を引き起こしましたプログラミングコミュニティ内で。この記事は、ベクトル操作におけるこれらの異なる役割を明確にすることを目的としています。
std::vector::reserve()
std::vector::reserve() はメモリを割り当てます。指定された数の要素については変更されますが、ベクトル自体のサイズは変更されません。ベクトルは元の論理サイズを維持します。このメソッドは、ベクターに要素を追加することが予想され、メモリを事前に割り当てることでパフォーマンスを最適化したい場合に役立ちます。
std::vector::resize()
std: :vector::resize() は、ベクトルのサイズを指定された要素数に変更します。ベクトルを拡張する必要がある場合は、追加のメモリが割り当てられます。 reserve() とは異なり、resize() は新しい要素をデフォルト値に初期化します。
使用例
質問に示されているコードを検討してください:
void MyClass::my_method() { my_member.reserve(n_dim); for (int k = 0; k < n_dim; k++) my_member[k] = k; }
応答によると、ここでのreserve()の使用は間違っています。要素をベクターに正しく書き込むには、resize() を使用する必要があります。
void MyClass::my_method() { my_member.resize(n_dim); for (int k = 0; k < n_dim; k++) my_member[k] = k; }
Visual Studio 2010 SP1 の動作
コードの前述の「クラッシュ」動作Visual Studio 2010 SP1 の は、応答に記載されている正しい動作と一致しています。ベクターのサイズを変更する前に、ベクターの論理サイズ (この場合は my_member[5]) を超える要素にアクセスしようとすると、未定義の動作が発生します。
予約と無効化
reserve() を使用してから、push_back() を介して要素を追加すると、参照、イテレータ、またはデータへのポインタが無効になる可能性があることに注意することが重要です。ベクトルで。これは、reserve() はサイズを変更せずにメモリを割り当て、新しい要素が追加されると別の場所に配置される可能性があるためです。
結論として、std::vector::reserve() と std::vector ::resize() には明確な目的があります。 Reserve() はメモリを事前に割り当て、resize() はベクトルのサイズを変更し、新しい要素を初期化します。効率的なベクトル操作には、それらの違いを理解することが不可欠です。
以上がstd::vector::reserve() と std::vector::resize(): いつどちらを使用する必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。