вставка в конец std::list во время цикла на основе диапазона

Я наткнулся на " Добавить элементы в вектор во время цикла на основе диапазона C++11" и не удивился, что это запрещено использоватьstd::vectorпотому что добавление может сделать итераторы недействительными. Однако вставка вstd::list не аннулирует ни один из итераторов, поэтому мне было интересно, можно ли это с std::list вместо того std::vector.

например

std::list<int> list({1});
for (int &cur : list)
{
    std::cout << cur << " ";
    if (cur < 10)
    {
        list.push_back(cur + 1);
    }
}

Кажется, все нормально компилируется, но меня беспокоит неопределенное поведение.

1 ответ

Решение

Да, вставка / удаление элементов std::listне делает недействительными указатели, ссылки или итераторы на элементы, за исключением удаленного элемента. Даже конечный итератор не изменяется или не становится недействительным.

Таким образом, это безопасно.

Но так как о безопасности нужно задумываться, это все равно нецелесообразно.

Другие вопросы по тегам