Modifica: la documentazione per std::remove
è stata corretta da quando è stata scritta questa risposta. La stessa cosa vale per list::remove
.
Lascia che ti faccia un esempio per mostrarti come cpluscplus.com può sbagliare.
Considera la std::remove
funzione da <algorithm>
.
Il fatto è che std::remove
non rimuove l'elemento dal contenitore. È perché std::remove
funziona solo con una coppia di iteratori e non sa nulla del contenitore che contiene effettivamente gli elementi. In effetti, non è possibile std::remove
conoscere il contenitore sottostante, poiché non è possibile che una coppia di iteratori riesca a scoprire il contenitore a cui appartengono gli iteratori. Quindi std::remove
non rimuove davvero gli oggetti, semplicemente perché non può . L'unico modo per effettivamente rimuovere un elemento da un contenitore è invocare una funzione membro su quel contenitore.
Quindi, se vuoi rimuovere gli elementi, usa Erase-Remove Idiom :
v.erase(std::remove(v.begin(), v.end(), 10), v.end());
Ma cplusplus.com
fornisce informazioni errate su std::remove
. Dice
Si noti che questa funzione non altera gli elementi oltre il nuovo fine, che mantengono i loro vecchi valori e sono ancora accessibili .
che non è corretto. L'iteratore nell'intervallo [new_end, old_end)
è ancora dichiarabile, ma ciò NON significa che mantengano i vecchi valori e siano ancora accessibili. Non sono specificati.
Allo stesso modo, cplusplus.com
fornisce anche informazioni erratelist::remove
. Si dice ,
Si noti che esiste una funzione di algoritmo globale, rimuovere, con un comportamento simile ma operante tra due iteratori.
che è completamente sbagliato. La rimozione globale, in particolare, std::remove
non è simile a list::remove
, poiché abbiamo visto che la prima NON rimuove realmente gli elementi dal contenitore perché non può , mentre la seconda (la funzione membro) rimuove davvero gli elementi perché può .
Questa risposta viene copiata dalla mia altra risposta nel seguente argomento, con poche modifiche:
Nota: da quando mi sono imbattuto recentemente in questo quando stavo rispondendo all'argomento sopra, me lo ricordo. Ci sono molti errori che ho riscontrato negli ultimi due anni, che non ricordo. Potrei aggiungerne altri in seguito, se dovessi imbattermi di nuovo.