Ошибка утверждения отладки. Векторный индекс c++ вне диапазона

следующий код заполняет вектор 10 значениями в первом цикле for. во втором для цикла я хочу, чтобы элементы вектора были напечатаны. Выход до оператора cout перед циклом j.Дает ошибку векторного индекса вне диапазона.

#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;
}

3 ответов


независимо от того, как вы индексируете откаты, ваш вектор содержит 10 элементов, индексированных из 0 (0, 1, ..., 9). Итак, во втором цикле v[j] недопустимо, когда j и 10.

это исправит ошибку:

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;
}

v и 10 элемент, индекс начинается с 0 to 9.

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

вы должны обновить for цикл

for(int j=9; j>=0; --j)
//      ^^^^^^^^^^
{
    cout<<v[j];   // out of range
}

или использовать обратный итератор для печати элементов в обратном порядке

for (auto ri = v.rbegin(); ri != v.rend(); ++ri)
{
  std::cout << *ri << std::endl;
}

этот тип ошибки обычно возникает при попытке доступа к данным через индекс, в котором данные не были назначены. например

//assign of data in to array
for(int i=0; i<10; i++){
   arr[i]=i;
}
//accessing of data through array index
for(int i=10; i>=0; i--){
cout << arr[i];
}

код выдаст ошибку (векторный индекс вне диапазона) потому что вы получаете доступ к arr[10], который еще не был назначен.