Dijo que quería utilizar el Borrar: eliminar idioma, así que aquí tiene una forma posible, utilizando un objeto función:
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," "));
}
Actualización: El código anterior tiene un error sutil. Según C++ 11 [algorithms.general]/10
:
[Nota: A menos que se especifique lo contrario, los algoritmos que toman los objetos de función como argumentos están autorizados a copiar los objetos función libremente. Los programadores para quienes la identidad del objeto es importante deberían considerar el uso de una clase contenedora que apunte a un objeto de implementación no copiado, como reference_wrapper<T>
(20.8.3), o alguna solución equivalente. nota -fin]
No parece haber ninguna "se especifique lo contrario" para std::list::remove_if
, por lo que este código puede fallar para eliminar todos los duplicados, ya que puede crear copias del predicado al principio, y luego usar diferentes copias de la predicado para diferentes partes de la lista. Example of this actually happening for std::remove_if.
Una solución simple para C++ 11 es reemplazar v.remove_if(u)
con:
v.remove_if(reference_wrapper<decltype(u)>(u));
En C++ 03 No estoy seguro de si la cita anterior estaba presente; pero si fuera entonces una solución sería hacer que foundElements
sea estático, o refactorizar Unifier
para que todas las copias de él hagan referencia a una sola instancia de foundElements
.
Link to related question
Bueno, obviamente, usted podría llamar a 'l.sort()' antes de llamar a 'l.unique()', pero supongo que debe haber una razón por la que no puede hacer eso? :) – hrnt
No estoy seguro acerca de los algoritmos STL, pero la forma obvia de hacerlo es iterar a través de la lista creando un conjunto de hash: si cada elemento no está en el conjunto, es único, así que agregue al conjunto; si está en el conjunto, es un duplicado, así que quítelo de la lista. – Rup
¿Por qué no nos propones algún código tuyo? –