Il modo idiomatico per rimuovere tutti gli elementi da un contenitore STL che soddisfano un determinato predicato è utilizzare lo remove-erase idiom. L'idea è quella di spostare il predicato (che è la funzione che produce vero o falso per qualche elemento) in una data funzione, dicono pred
e poi:
static bool pred(const std::string &s) {
// ...
}
std::vector<std::string> v;
v.erase(std::remove_if(v.begin(), v.end(), pred), v.end());
Se ti ostini a usare indici, non si dovrebbe incrementare l'indice per ogni elemento, ma solo per coloro che non vengono rimossi:
std::vector<std::string>::size_type i = 0;
while (i < v.size()) {
if (shouldBeRemoved(v[i])) {
v.erase(v.begin() + i);
} else {
++i;
}
}
Tuttavia, questo non è solo più codice e meno idiomatica (leggi: i programmatori C++ in realtà hanno a guardare il codice mentre il 'cancellare & rimuovere 'l'idioma dà immediatamente un'idea di cosa sta succedendo), ma anche molto meno efficiente perché i vettori memorizzano th Gli elementi di EIR in un blocco contiguo di memoria, quindi cancellando posizioni diverse dalla fine del vettore, spostano anche tutti gli elementi dopo che il segmento è stato cancellato nelle loro nuove posizioni.
fonte
2011-12-21 22:37:53
Si potrebbe usare 'remove_if' e' cancella' forse? http://en.wikipedia.org/wiki/Erase-remove_idiom – msandiford
Cancella Rimuovi: http://stackoverflow.com/questions/4175896/safe-way-to-continuously-erase-from-a-ddector –