3

各要素が 1000 未満の 3 の倍数であるベクトルを作成しようとしています。2 つの方法を試しましたが、そのうちの 1 つだけが機能しました。機能しない方法は次のとおりです。

int main() {
    vector<int> multiples_of_three;
    for (int i = 0; i <= 1000/3; ++i)
        multiples_of_three[i] = 3*i;
        cout << multiples_of_three[i] << "\n";
}

これにより、特に で範囲外エラーが発生しましたmultiples_of_three[i]。この次のコードは機能しました。

int main() {
    vector<int> multiples_of_three(334);
    for (int i = 0; i <  multiples_of_three.size(); ++i) {
        multiples_of_three[i] = 3*i;
        cout <<  multiples_of_three[i];
}

したがって、ベクトルのサイズを定義した場合、その制約内に保つことができます。for ループに要素数を指定させようとすると、範囲外エラーが発生するのはなぜですか?

ありがとう!

4

4 に答える 4

2

デフォルトのコンストラクター (ここでは : と呼ばれますvector<int> multiples_of_three;) は、空のベクターを作成します。追加する必要があるオブジェクトの数がわかっている場合は、それらにデータを入力するpush_backか、その数をコンストラクターに渡すと、常に増加するのではなく、必要な量のメモリを一度に予約できます (つまり、メモリを割り当てて古いメモリをコピーすることを意味します)。新しい) ベクトルに。

もう 1 つの方法はreserve、空のデフォルトの構築済みベクトルから呼び出し、それを使用push_backして設定することです。reserveベクトルのサイズを変更せずに、必要な量のオブジェクトを保持するのに十分なメモリを予約します。の利点は、ベクターの作成直後に初期化ループでオブジェクトを上書きするため、必要のないreserveすべてのオブジェクトに対してデフォルトのコンストラクターが呼び出されないことです (またはパラメーター化されたコンストラクターで行われるため)。resize

于 2014-06-03T07:41:17.197 に答える
1

indexerpush_back()経由で追加するのではなく、使用する必要があります。

インデクサーは、境界内でのみベクターへの読み取り/書き込みアクセスに使用できます。

于 2014-06-03T07:34:37.107 に答える
1

を使用するため、ベクトルのサイズが魔法のように大きくなることはありません[]。最初の例では要素が 0 で始まり、それを成長させることはありませんでした。

于 2014-06-03T07:34:47.043 に答える