Ошибка утверждения отладки. Векторный индекс 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], который еще не был назначен.