Per quanto riguarda l'algoritmo, la rimozione di un set di elementi da un array contiguo può essere eseguita in modo efficace in due parti.C'è un motivo per usare `remove` al di fuori dell'idioma di cancellazione-rimozione?
- Sposta tutti gli elementi da non eliminare nella parte anteriore dell'array.
- Contrassegna la matrice più piccola.
Questo può essere fatto in C++
con l'idioma di cancellazione-rimozione.
vector<T> v; // v = {0,1,2,3,0,0,7};
vector<T>::iterator it = remove(v.begin(),v.end(),e);
// move all elements not to be deleted to the front
// Yes, remove is not the brightest name for that.
// Especially as list::remove really remove elements from the list.
// now v = {1,2,3,7,?,?,?} results marked in question marks
// are implementation dependent.
v.erase(it,v.end());
// get rid of the elements marked as question marks.
// v = {1,2,3,7}
Ora, il contenuto degli elementi nel punto interrogativo è sconosciuto. L'unica cosa che possiamo fare con loro è eliminarli (sovrascrivendoli o rimuovendoli).
Esiste una situazione reale in cui è necessario utilizzare remove
senza cancellarlo? L'unica situazione che potrei pensare è
copy(src.begin(),src.end(),remove(v.begin(),v.end(),e),v.end());
sostituendo tutti A
s con B
s, e richiedendo che tutti i nuovi B
s saranno contigue. Non ha molto senso.
modificare: Ha senso a qualcosa di diverso contenitore di memoria contigious (deque
e vector
in realtà)?
Se davvero io sono corretto, perché è stato implementato come un algoritmo autonomo, invece di vector::remove_if
, dequeue::remove_if
ecc
@MatthieuM: Non proprio. Sono * non specificati * in realtà. Vedi questo: http://stackoverflow.com/questions/6456870/stl-remove-doesnt-work-as-expected/6456967#6456967 – Nawaz