2015-02-23 3 views
-5

Я новичок в программировании на C++, и когда я запускаю это, он успешно компилируется и выводит элементы массива, но я получаю сообщение об ошибке «векторный индекс вне диапазона». Что не так с этим кодом? Я рассмотрел некоторые другие вопросы, и похоже, что ни у кого из них не было подобных примеров векторов.Ошибка в индексе вне диапазона?

#include <iostream> 
#include <vector> 
#include <random> 
#include <time.h> 

using namespace std; 

int main() { 
srand(time(NULL)); 
    int arraysize; 
cout << "Enter the size of your array:" << endl; 
cin >> arraysize; 
vector<int> numbers(arraysize); 
vector<int>::size_type sizecheck = numbers.size(); 

cout << "This is the unsorted array:" << endl; 
for (int z = 0; numbers[z] < sizecheck; z++) 
{ 
    numbers[z] = rand() % 10 + 1; 
    cout << numbers[z] << endl; 
} 

return 0; 
} 
+2

Попробуйте заменить 'for (int z = 0; numbers [z] Galik

+1

Проблема с вашим кодом в том, что: [вы использовали] векторный индекс [который] вне диапазона – thang

+0

Это означает, что указатель, который вы предоставили вектору '[z]', слишком велик. –

ответ

2

Ваш код на самом деле будет бесконечный цикл с учетом бесконечной памяти, однако, так как существует конечный объем памяти, выделенной для вектора, он имеет неопределенное поведение. numbers будет стоить инициализировать (установить каждый элемент в 0), что означает, что условие всегда будет 0 < sizecheck. Как только z достигнет количества элементов в вашем векторе, вы превысите границы массива и перейдете в неопределенную область поведения.

Ваша IDE или что-то еще, что вы используете, уже поймала ошибку, но вы можете использовать более безопасный вариант, at() вместо operator[]. Это вызовет исключение и предоставит полезную информацию. Например:

for (int z = 0; numbers.at(z) < sizecheck; z++) 
{ 
    numbers.at(z) = rand() % 10 + 1; 
    cout << z << " " << numbers.at(z) << endl; 
} 

0 2 
1 8 
2 10 
3 9 
4 8 
5 2 
6 3 
7 4 
8 4 
9 2 

terminate called after throwing an instance of 'std::out_of_range' 
    what(): vector::_M_range_check: __n (which is 10) >= this->size() (which is 10) 

Как указано в комментариях, что вы, вероятно, означало, чтобы сделать было z < sizecheck, хотя вы должны сделать z типа std::vector<int>::size_type просто, чтобы быть безопасным.

0

@remyabel предоставил вам абсолютно правильный ответ, но в дополнение к этому вы должны использовать iterator, а не индексированный цикл, когда цикл с использованием стандартных компонентов, таких как vector.

например.

vector<int>::iterator it; 
for(it = numbers.begin(); it != numbers.end(); ++it) 
{ 
    *it = rand() % 10 + 1; 
    cout << *it << endl; 
} 

Примечание: это только подходит, если вы хотите изменить количество элементов в векторе, как вы итерацию, как это происходит в данном случае. Если вы добавляете или удаляете элементы во время итерации, вы можете аннулировать свой итератор.

Смежные вопросы