Возможно, стоит добавить, что итератор вставки любого типа (std::back_insert_iterator
, std::front_insert_iterator
, std::insert_iterator
) остается в силе до тех пор, пока все вставки выполняются через этот итератор и никакое другое событие, не выполняющее итератор .
Например, когда вы выполняете серию операций вставки в std::vector
с помощью std::insert_iterator
, вполне возможно, что вектор будет иметь событие перераспределения, что приведет к аннулированию всех итераторов, которые «точка» в этот вектор. Тем не менее, итератор вставки, о котором идет речь, гарантированно остается в силе, т. Е. Вы можете безопасно продолжить последовательность вставок. Нет необходимости беспокоиться о запуске перераспределения вектора вообще.
Это опять же относится только к вставкам, выполненным через сам итератор вставки. Если итератор-недействительное событие инициируется некоторым независимым действием на контейнер, то итератор вставки также становится недействительным также в соответствии с общими правилами.
Например, этот код
std::vector<int> v(10);
std::vector<int>::iterator it = v.begin() + 5;
std::insert_iterator<std::vector<int> > it_ins(v, it);
for (unsigned n = 20; n > 0; --n)
*it_ins++ = rand();
гарантированно выполняет действительную последовательность вложений в вектор, даже если вектор «решает» перераспределить где-то посередине этого процесса.