У меня очень сильное чувство, что эта строка кода:
i++;
- это ваш преступник, в котором отсутствует либо необходимое условие разрыва, либо другая условная проверка, которая отсутствует в ваших циклах.Поскольку это относится к условиям ваших вложенных циклов while, поскольку они основаны на текущем размере вашего вектора и не обновляются соответствующим образом.
while (pieces.size() > 1) {
// ...
while (i < pieces.size()) {
// ...
while (j < pieces.size()) {
// ...
}
}
}
Это связано с тем, что вы вызываете это внутрисамый внутренний вложенный цикл:
pieces.erase(pieces.begin() + j);
Вы находитесь во вложенном цикле while и, если выполняется определенное условие, вы стираете объект в этом месте индекса в вашем векторе, пока вывсе еще находятся во внутреннем цикле while, от которого вы никогда не прерветесь или не проверите, является ли индекс по-прежнему действительным.
Изначально вы вводите цикл while с вектором, который имеет 6 записей, и вызываете стирание на нем в рамках вложенного цикла, и теперь ваш вектор имеет 5 записей.
Это может нанести ущерб вашим циклам, потому что ваши счетчики индекса i
& j
были установлены в соответствии с исходной длиной вашего вектора размером 6
, но теперь вектор был уменьшен доразмером 5
, пока вы все еще находитесь во внутреннем самом вложенном цикле, из которого вы никогда не ломаетесь и не проверяете, действительны ли индексы.На следующей итерации эти значения теперь становятся недействительными, поскольку вы никогда не выходите из циклов, чтобы сбросить индексы в соответствии с новым размером вашего вектора, и не проверяете, являются ли они действительными.
Попробуйте запуститьэта простая программа, которая продемонстрирует, что я имею в виду, когда индексы становятся недействительными в ваших вложенных циклах.
int main() {
std::vector<std::string> words{ "please", "erase", "me" };
std::cout << "Original Size: " << words.size() << '\n';
for (auto& s : words)
std::cout << s << " ";
std::cout << '\n';
words.erase(words.begin() + 2);
std::cout << "New Size: " << words.size() << '\n';
for (auto& s : words)
std::cout << s << " ";
std::cout << '\n';
return 0;
}
-Output-
Original Size: 3
please erase me
New Size: 2
please erase