E 'probabilmente la pena di aggiungere che un iteratore di inserimento di qualsiasi tipo ( std::back_insert_iterator
, std::front_insert_iterator
, std::insert_iterator
) è garantito a rimanere valido fino a quando tutte le inserzioni vengono eseguite attraverso questo iteratore e si verifica nessun altro evento iteratore-invalidanti indipendente.
Ad esempio, quando si eseguono una serie di operazioni di inserimento in una std::vector
utilizzando std::insert_iterator
, è del tutto possibile che questi inserimenti attiveranno la riallocazione del vettore, che invaliderà tutti gli iteratori che "puntano" in quel vettore. Tuttavia, si garantisce che l'iteratore di inserimento in questione rimanga valido, ovvero è possibile continuare in sicurezza la sequenza di inserimenti. Non è necessario preoccuparsi di innescare la riallocazione dei vettori.
Questo, ancora una volta, si applica solo agli inserimenti eseguiti tramite lo stesso iteratore di inserimento. Se l'evento invalidante dell'iteratore viene attivato da un'azione indipendente sul contenitore, anche l'inserimento dell'iteratore viene invalidato in conformità con le regole generali.
Ad esempio, questo codice
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();
è garantito per eseguire una valida sequenza di inserimenti nel vettore, anche se il vettore "decide" di riallocare da qualche parte nel mezzo di questo processo. Iteratore it
diventerà ovviamente non valido, ma it_ins
continuerà a rimanere valido.