ホームページ >バックエンド開発 >C++ >`std::vector::reserve()` と `std::vector::resize()`: いつどちらを使用する必要がありますか?

`std::vector::reserve()` と `std::vector::resize()`: いつどちらを使用する必要がありますか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-25 01:03:10628ブラウズ

`std::vector::reserve()` vs. `std::vector::resize()`: When Should You Use Which?

std::vector::reserve() と std::vector::resize()

最近のディスカッションでは、std:: の使用に関するトピックがありました。 Vector::reserve() と std::vector::resize() の対立が生じました。この投稿では、これら 2 つのメソッドの違いについて詳しく説明します。

コンテキストを提供するために、サンプル コード スニペットを考えてみましょう。

void MyClass::my_method() {
    my_member.reserve(n_dim);
    for (int k = 0; k < n_dim; k++) my_member[k] = k;
}

このコードの目的は、次のとおりです。指定された容量 (n_dim) を持つベクトルを作成し、そのベクトルを反復処理して、その要素にアクセスして変更します。ただし、reserve() の使用がこの目的に適切であるかどうかという疑問が生じます。

違いを理解する

std::vector::reserve() は、対応するためにベクトルにメモリを割り当てるように設計されています。指定された数の要素。ただし、実際にはベクトルのサイズは変更されません。ベクターの論理サイズは同じままです。つまり、現在の論理サイズを超える要素にアクセスしようとした場合の動作は未定義です。

一方、std::vector::resize() は両方ともメモリを割り当て、ベクトルのサイズを変更します。ベクトルの論理サイズを指定された値に設定します。サイズ変更の結果として作成される追加の要素は、デフォルト値 (たとえば、int の場合は 0) に初期化されます。

サンプル コードへの適用

ここで示したサンプル コードでは、std を使用しています。 std::vector::resize() の代わりに ::vector::reserve() を使用すると、未定義の動作が発生する可能性があります。コードでは、reserve() を呼び出した後のベクトルのサイズが n_dim であると想定していますが、実際はそうではありません。したがって、ベクトルの元のサイズ以上の k で my_member[k] にアクセスすると、メモリ アクセス違反またはその他の未定義の動作が発生します。

結論

結論としては、正しくベクター内の要素にアクセスして変更するには、std::vector::reserve() と std::vector::resize() の違いを理解することが不可欠です。 reserve() はサイズを変更せずにメモリを割り当てるために使用されますが、resize() はメモリ割り当てとベクトルのサイズの両方を変更し、新しく作成された要素を初期化します。提供されているサンプル コードでは、 std::vector::resize() を使用してメモリを割り当て、ベクトルのサイズを設定し、要素への適切なアクセスと変更を可能にする必要があります。

以上が`std::vector::reserve()` と `std::vector::resize()`: いつどちらを使用する必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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