Итерация по контейнерам STL и удаление / добавление нескольких элементов
Одна из самых частых ошибок в моем коде заключается в том, что контейнеры STL изменяются во время цикла.
Элементы удаляются или добавляются во время выполнения цикла, поэтому я обычно сталкиваюсь с исключениями за пределами границ.
Мой цикл for обычно выглядит так:
for (auto& Item : Items) { // Will not work when Items container is modified
//... loop logic
}
Когда несколько предметов могут быть удалены, я использую это чудовище:
for (int Index=Items.size()-1;Index<=0;Index--) {
if (Index<Items.size()) { //Because multiple items can be removed in a single loop
//... loop logic
}
}
Это выглядит плохо, и я чувствую себя плохо, используя этот второй вариант. Причина, по которой несколько элементов могут быть удалены, связана с событиями, когда одно событие может удалить любое количество элементов.
Вот некоторый псевдокод, чтобы проиллюстрировать, когда это происходит:
// for each button in vector<button> {
// process button events
// event adds more buttons to vector<button>
// *ERROR* vector<button> is modified during loop.
// }
В другом примере представьте вектор со следующими элементами:
// 0 1 2 3 4 5 6 7 8 9
Мы начинаем наш цикл в0
и идти элемент за элементом. В4
Хочу удалить элементы1
,4
а также9
поэтому мы не можем использовать нормальный цикл здесь.