Ha detto che voleva utilizzare l'erase- rimuovere linguaggio, ecco un modo possibile, utilizzando un oggetto funzione:
struct Unifier{
set<int> foundElements;
bool operator()(int & a){
if(foundElements.find(a) != foundElements.end()){
return true;
}else{
foundElements.insert(a);
return false;
}
}
};
int main(){
list<int> v;
v.push_back(5);
v.push_back(4);
v.push_back(5);
v.push_back(3);
v.push_back(5);
v.push_back(3);
copy (v.begin(), v.end(), ostream_iterator<int>(cout," "));
Unifier u;
v.remove_if(u);
cout << endl << "After:" << endl;
copy (v.begin(), v.end(), ostream_iterator<int>(cout," "));
}
Aggiornamento: il codice precedente presenta un bug sottile. Secondo C++ 11 [algorithms.general]/10
:
[Nota: se non diversamente specificato, gli algoritmi che accettano oggetti funzione come argomenti sono autorizzati a copiare liberamente tali oggetti funzione. I programmatori per i quali l'identità dell'oggetto è importante dovrebbero prendere in considerazione l'utilizzo di una classe wrapper che punta a un oggetto di implementazione non protetto, ad esempio reference_wrapper<T>
(20.8.3) o una soluzione equivalente. Nota -end]
non sembra esserci nessun "altrimenti specificato" per std::list::remove_if
, quindi questo codice potrebbe non riuscire a rimuovere tutti i duplicati perché può creare copie del predicato alla partenza, e quindi utilizzare diverse copie del predicato per diverse parti della lista. Example of this actually happening for std::remove_if.
Una semplice correzione per C++ 11 è quello di sostituire v.remove_if(u)
con:
v.remove_if(reference_wrapper<decltype(u)>(u));
In C++ 03 non sono sicuro se la citazione di cui sopra era presente; ma se fosse una correzione, sarebbe necessario rendere statico lo foundElements
o il refactor Unifier
in modo che tutte le copie di esso facciano riferimento a una singola istanza di foundElements
.
Link to related question
fonte
2011-02-03 11:56:39
Beh, ovviamente si potrebbe chiamare 'l.sort()' prima di chiamare 'l.unique()', ma presumo che ci debba essere una ragione per cui non si può farlo? :) – hrnt
Non sono sicuro degli algoritmi STL, ma il modo ovvio per farlo è quello di scorrere l'elenco di un set di hash: se ciascun elemento non è nel set è univoco quindi aggiungi al set; se è nel set è un duplicato quindi rimuoverlo dalla lista. – Rup
Perché non ci proponi un tuo codice? –