вставка в конец std :: list во время диапазона, основанного на цикле - PullRequest
3 голосов
/ 02 февраля 2020

Я наткнулся на « Добавление элементов к вектору во время основанного на диапазоне l oop 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 Ответ

1 голос
/ 02 февраля 2020

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

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

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

...