Итерация по контейнерам 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&nbsp;и идти элемент за элементом. В4Хочу удалить элементы1,4&nbsp;а также9&nbsp;поэтому мы не можем использовать нормальный цикл здесь.