Вектор push_back в циклах while и for возвращает сигнал SIGABRT (сигнал 6) (C++)
Я делаю игру на C++, которая требует от меня инициализации 36 чисел в вектор. Вы не можете инициализировать вектор списком инициализаторов, поэтому я создал цикл while, чтобы быстрее его инициализировать. Я хочу, чтобы он возвращал 4 каждого числа от 2 до 10, поэтому я использую int с именем четвертого, чтобы проверить, является ли число цикла кратным 4. Если это так, он меняет число, возвращаемое на следующий номер вверх. Когда я запускаю его, я получаю SIGABRT. Это должно быть проблемой с четвертым, потому что, когда я вынул его, он не дал сигнал. Вот программа:
for (int i; i < 36;) {
int fourth = 0;
fourth++;
fourth%=4;
vec.push_back(i);
if (fourth == 0) {
i++;
}
}
Пожалуйста помоги!
3 ответа
Вы не инициализируете i
, использование for (int i = 0; i<36;)
, Также новая переменная forth
выделяется на каждой итерации тела цикла. Таким образом, тест fourth==0
всегда будет давать false
,
Я хочу, чтобы это оттолкнуло 4 каждого числа от 2 до 10
Я бы использовал самый прямой подход:
for (int value = 2; value <= 10; ++value)
{
for (int count = 0; count < 4; ++count)
{
vec.push_back(value);
}
}
Единственная оптимизация, которую я бы сделал, - это убедиться, что емкость вектора достаточна перед входом в цикл. Я бы оставил другие оптимизации для компилятора. Я предполагаю, что то, что вы получаете, пропуская внутренний цикл, вы проигрываете частым делением по модулю.
Вы не инициализировали i, и вы сбрасываете четвертое в каждой итерации. Кроме того, с вашим условием для цикла, я не думаю, что он будет делать то, что вы хотите.
Я думаю, что это должно работать:
int fourth = 0;
for (int i = 2; i<=10;) {
fourth++;
fourth%=4;
vec.push_back(i);
if (fourth==0) {
i++;
}
}
Мне удалось создать объявление статического массива и передать этот массив в вектор при инициализации без проблем. Довольно чисто тоже:
const int initialValues[36] = {0,1,2...,35};
std::vector foo(initialValues);
Работает с константами, но не пробовал с неконстантными массивами.