Ошибка выхода за пределы диапазона при попытке создать и заполнить вектор с помощью цикла for (C ++)

Я пытаюсь создать вектор, где каждый элемент кратен 3 ниже 1000. Я пробовал два способа, только один из которых работал. Нерабочим способом было:

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 определять количество элементов, я получаю ошибку вне диапазона?

Спасибо!

3

Решение

Это прекрасно работает:

#include <iostream>
#include <vector>
using namespace std;

//this one is the edited version

int main() {
vector<int> multiples_of_three(334);      //notice the change: I declared the size
for (int i = 0; i <= 1000 / 3; ++i){
multiples_of_three[i] = 3 * i;
cout << multiples_of_three[i] << "\n";
}
system("pause");
}Consider these two examples below:

//=========================the following example has errors =====================
int main() {

vector<int> multiples_of_three;
multiples_of_three[0] = 0;  // error
multiples_of_three[1] = 3;  // error

cout << "Here they are: " << multiples_of_three[0]; cout << endl;
cout << "Here they are: " << multiples_of_three[1]; cout << endl;

cout << endl;
system("pause");

return 0;
}
//============================the following example works==========================

int main() {
vector<int> multiples_of_three;
multiples_of_three.push_back(0);
multiples_of_three.push_back(3);

cout << "Here they are: " << multiples_of_three[0]; cout << endl;
cout << "Here they are: " << multiples_of_three[1]; cout << endl;

cout << endl;
system("pause");
return 0;
}

Поэтому, если вы не объявили размер, никогда не используйте индексы напрямую для назначения значений (как в первом примере). Однако, если значения уже были назначены, вы можете использовать индексы для получения значений (как во 2-м примере). А в случае, если вы хотите использовать индексы для присвоения значений, сначала объявите размер массива (как в отредактированной версии)!

2

Другие решения

конструктор по умолчанию (который вызывается здесь: vector<int> multiples_of_three;) создает пустой вектор. Вы можете заполнить их push_back или лучше, если вы знаете количество объектов, которые вы должны добавить, передайте это число конструктору, чтобы он зарезервировал необходимый объем памяти сразу, а не постоянно увеличивался (это означает выделение памяти и копирование старого меню в новое). вектор.

другая альтернатива — позвонить reserve из пустого вектора по умолчанию и использовать push_back заселить это. reserve резервирует достаточно памяти для хранения необходимого количества объектов, но без изменения размера вектора. преимущество reserve является то, что конструктор по умолчанию не вызывается для каждого объекта (как это будет сделано с resize или параметризованный конструктор), в котором нет необходимости, поскольку вы перезаписываете объект в цикле инициализации сразу после создания вектора.

2

Вам нужно использовать push_back() вместо добавления через индексатор.

Индексатор может использоваться для доступа на чтение / запись к вектору только в определенных пределах.

1

Вектор волшебным образом не увеличивается в размерах, потому что вы используете [], Это началось с 0 элементов в первом примере, и вы никогда не увеличивали его.

1
По вопросам рекламы [email protected]