Ho utilizzato il nuovo ciclo for-based fornito dallo standard C++ 11 e ho trovato la seguente domanda: supponiamo di iterare su uno vector<>
usando il range for
, e aggiungiamo qualche elemento alla fine del vettore durante questa iterazione. Quindi, quando termina il ciclo?Aggiunta di elementi a un vettore durante il ciclo basato su intervallo C++ 11
Ad esempio, si veda questo codice:
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<unsigned> test({1,2,3});
for(auto &num : test) {
cout << num << " ";
if(num % 2)
test.push_back(num + 10);
}
cout << "\n";
for(auto &num : test)
cout << num << " ";
return 0;
}
Ho testato G ++ 4.8 e Apple LLVM versione 4.2 (clang ++) con "-std = C++ 11" bandiera, e l'uscita è (per entrambi) :
1 2 3
1 2 3 11 13
Si noti che il primo ciclo termina alla fine del vettore originale, sebbene aggiungiamo altri elementi. Sembra che il ciclo for range valuti solo la fine del contenitore. E 'questo, di fatto, il comportamento corretto del range-for? È specificato dal comitato? Possiamo fidarci di questo comportamento?
Si noti che se cambiamo il primo loop
for(vector<unsigned>::iterator it = test.begin(); it != test.end(); ++it)
con validi gli iteratori e venire con un segmentation fault.
sebbene l'aggiunta non stia cancellando, si tratta di un duplicato di [Cancellazione di un elemento da un contenitore all'interno di un ciclo per ciclo] (http://stackoverflow.com/questions/8624686/erasing-an-element- da-a-container-while-inside-a-range-based-per-loop) perché la risposta qui mostra ciò che lo standard dice che l'intervallo-per-end-end viene determinato e salvato prima dell'inizio del ciclo e che valore salvato viene utilizzato nelle iterazioni successive. –
@KateGregory direi che questo non è un duplicato perché rimuovere l'elemento corrente sarebbe un comportamento indefinito per tutti i contenitori, ma l'aggiunta di un elemento è solo un comportamento indefinito per 'std :: vector',' std :: deque', 'std: : unordered_set' e 'std :: unorderd_map'. –
Mi è sembrata quella domanda, dal comportamento leggermente diverso. Comunque grazie. –