Ci sono state alcune domande su questo problema in precedenza; la mia comprensione è che chiamando std::vector::erase
invaliderà solo gli iteratori che si trovano in una posizione dopo l'elemento cancellato. Tuttavia, dopo aver cancellato un elemento, l'iteratore in quella posizione è ancora valido (a patto, ovviamente, che non punti a end()
dopo la cancellazione)?std :: invalidazione iteratore vettoriale
La mia comprensione di come un vettore sarebbe implementato sembra suggerire che l'iteratore sia utilizzabile in modo definitivo, ma non sono del tutto sicuro che possa portare a un comportamento indefinito.
Come esempio di ciò di cui sto parlando, il seguente codice rimuove tutti gli interi dispari da un vettore. Questo codice causa un comportamento indefinito?
typedef std::vector<int> vectype;
vectype vec;
for (int i = 0; i < 100; ++i) vec.push_back(i);
vectype::iterator it = vec.begin();
while (it != vec.end()) {
if (*it % 2 == 1) vec.erase(it);
else ++it;
}
Il codice funziona correttamente sulla mia macchina, ma questo non mi convince che sia valido.
Perché si passa 'x' per riferimento const anziché da valore? – fredoverflow
@Fred: nessun motivo particolare; Grazie per la segnalazione. –
@James Ma allora come funziona sopra il codice fornito in questione funziona poiché la cancellazione annullerà gli iteratori? – Kapil