1. ホーム
  2. c++

[解決済み】デバッグアサーションに失敗しました。C++のベクトル添え字が範囲外

2022-01-22 16:46:09

質問

次のコードは、最初のforループでベクトルに10個の値を入力し、2番目のforループでベクトルの要素を表示します。 出力は、jループの前にcout文までです。ベクトル添え字が範囲外であるというエラーが発生します。

#include "stdafx.h"
#include "iostream"
#include "vector"
using namespace std;

int _tmain(int argc, _TCHAR * argv[])
{
    vector<int> v;

    cout << "Hello India" << endl;
    cout << "Size of vector is: " << v.size() << endl;
    for (int i = 1; i <= 10; ++i)
    {
        v.push_back(i);

    }
    cout << "size of vector: " << v.size() << endl;

    for (int j = 10; j > 0; --j)
    {
        cout << v[j];
    }

    return 0;
}


解決方法は?

プッシュバックのインデックスをどのように作成するかにかかわらず、ベクトルには、以下の場所からインデックスされた10個の要素が含まれます。 0 ( 0 , 1 , ..., 9 ). つまり、2つ目のループでは v[j] が無効な場合 j10 .

これでエラーは直ります。

for(int j = 9;j >= 0;--j)
{
    cout << v[j];
}

一般的には、インデックスを次のように考えるのがよいでしょう。 0 をベースにしているので、最初のループもこのように変更することをお勧めします。

for(int i = 0;i < 10;++i)
{
    v.push_back(i);
}

また、コンテナの要素にアクセスするには、イテレータ(この場合は逆イテレータ)を使用するのが慣用的な方法である。

for (vector<int>::reverse_iterator i = v.rbegin(); i != v.rend(); ++i)
{
    std::cout << *i << std::endl;
}