вставка в конец 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
не делает недействительными указатели, ссылки или итераторы на элементы, за исключением удаленного элемента. Даже конечный итератор не изменяется или не становится недействительным.
Таким образом, это безопасно.
Но так как о безопасности нужно задумываться, это все равно нецелесообразно.