É provavelmente vale a pena acrescentar que um iterador inserção de qualquer tipo ( std::back_insert_iterator
, std::front_insert_iterator
,std::insert_iterator
) é garantido para permanecer válido, desde que todas as inserções são realizadas através deste iterador e nenhum outro evento de invalidação iterador independente ocorre.
Por exemplo, quando você está executando uma série de operações de inserção em um std::vector
usandostd::insert_iterator
, é bem possível que essas inserções acionem a realocação de vetores, o que invalidará todos os iteradores que "apontam" para esse vetor. No entanto, o iterador de inserção em questão é garantido para permanecer válido, ou seja, você pode continuar com segurança a sequência de inserções. Não há necessidade de se preocupar em acionar a realocação de vetores.
Isso, novamente, se aplica apenas às inserções executadas pelo próprio iterador de inserção. Se o evento de invalidação do iterador for acionado por alguma ação independente no contêiner, o iterador de inserção também será invalidado de acordo com as regras gerais.
Por exemplo, este código
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();
é garantido para executar uma sequência válida de inserções no vetor, mesmo se o vetor "decidir" realocar em algum lugar no meio desse processo. O iterador it
obviamente ficará inválido, mas it_ins
continuará válido.