Secondo alcuni documenti STL che ho trovato, l'inserimento o l'eliminazione di elementi in un elenco std :: non invalida gli iteratori. Ciò significa che è consentito eseguire il loop su un elenco (da begin()
a end()
) e quindi aggiungere elementi utilizzando push_front.Perché un push_back su un elenco std :: cambia un iteratore inverso inizializzato con rbegin?
Ad esempio, nel seguente codice, inizializzo un elenco con gli elementi a, b e c, quindi eseguo il loop su di esso ed eseguo un push_front degli elementi. Il risultato dovrebbe essere cbaabc, che è esattamente quello che ottengo:
std::list<std::string> testList;
testList.push_back("a");
testList.push_back("b");
testList.push_back("c");
for (std::list<std::string>::iterator itList = testList.begin(); itList != testList.end(); ++itList)
testList.push_front(*itList);
for (std::list<std::string>::const_iterator itList = testList.begin(); itList != testList.end(); ++itList)
std::cout << *itList << std::endl;
Quando uso iteratori inversi (anello rbegin()
-rend()
) e usare push_back, mi sarei aspettato un comportamento simile, vale a dire il risultato di abccba. Tuttavia, ottengo un risultato diverso:
std::list<std::string> testList;
testList.push_back("a");
testList.push_back("b");
testList.push_back("c");
for (std::list<std::string>::reverse_iterator itList = testList.rbegin(); itList != testList.rend(); ++itList)
testList.push_back(*itList);
for (std::list<std::string>::const_iterator itList = testList.begin(); itList != testList.end(); ++itList)
std::cout << *itList << std::endl;
il risultato non è abccba
, ma abcccba
. Esatto, c'è una c aggiuntiva aggiunta.
Sembra che il primo push_back modifichi anche il valore dell'iteratore inizializzato con rbegin(). Dopo il push_back non punta più al terzo elemento della lista (che era in precedenza l'ultimo), ma al quarto elemento (che ora è l'ultimo).
Ho provato questo con Visual Studio 2010 e con GCC ed entrambi restituiscono lo stesso risultato.
È un errore? O qualche strano comportamento di iteratori rovesciati di cui non sono a conoscenza?
Grazie, hai qualche riferimento per i dettagli tecnici? – Patrick
Aggiunto un preventivo dallo standard. –
+1. Penso che la citazione dallo standard lo confermi. –