Es probablemente la pena añadir que un iterador inserción de cualquier tipo ( std::back_insert_iterator
, std::front_insert_iterator
,std::insert_iterator
) se garantiza que permanecerá válida siempre y cuando todas las inserciones se realizan a través de este iterador y se produce ningún otro evento independiente iterador-invalidar.
Por ejemplo, cuando realiza una serie de operaciones de inserción en un std::vector
mediantestd::insert_iterator
, es muy posible que estas inserciones activen la reasignación de vectores, lo que invalidará todos los iteradores que "apunten" a ese vector. Sin embargo, se garantiza que el iterador de inserción en cuestión seguirá siendo válido, es decir, puede continuar con seguridad la secuencia de inserciones. No hay necesidad de preocuparse por desencadenar la reasignación de vectores.
Esto, nuevamente, se aplica solo a las inserciones realizadas a través del iterador de inserción. Si el evento de invalidación de iterador se desencadena por alguna acción independiente en el contenedor, el iterador de inserción también se invalida de acuerdo con las reglas generales.
Por ejemplo, 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();
está garantizado para realizar una secuencia válida de inserciones en el vector, incluso si el vector "decide" reasignar en algún lugar en medio de este proceso. it
Obviamente, Iterator dejará de ser válido, pero it_ins
seguirá siendo válido.