Aufrechterhaltung der Reihenfolge bei der Entfernung von Duplikaten: STL-Algorithmen zur Rettung
Beim Umgang mit unsortierten Vektoren ist die Aufgabe, Duplikate zu entfernen und gleichzeitig die zu erhalten Die ursprüngliche Bestellung kann entmutigend sein. Während Brute-Force-Methoden wie die Verwendung eines Sets zum Verfolgen eindeutiger Elemente realisierbar sind, wollen wir eine elegantere Lösung mithilfe von STL-Algorithmen erkunden.
Ein leistungsstarker Algorithmus in STL ist std::copy_if. Zum Filtern von Elementen ist ein Prädikat erforderlich, wobei diejenigen, die den Kriterien entsprechen, in einen neuen Container kopiert werden. Um es hier anzuwenden, definieren wir ein NotDuplicate-Prädikat, das einen Satz verarbeiteter Elemente verwaltet und als falsch ausgewertet wird, wenn zuvor ein Element angetroffen wurde.
Hier ist eine vereinfachte Implementierung des NotDuplicate Prädikat:
struct NotDuplicate { bool operator()(const int& element) { return s_.insert(element).second; } private: std::set<int> s_; };
Mit diesem Prädikat in der Hand können wir std::copy_if verwenden, um unser Ziel zu erreichen:
std::vector<int> uniqueNumbers; NotDuplicate<int> pred; std::copy_if(numbers.begin(), numbers.end(), std::back_inserter(uniqueNumbers), std::ref(pred));
Dieser Code iteriert über den ursprünglichen Vektor und filtert Elemente mithilfe des Prädikats NotDuplicate. Elemente, die zuvor noch nicht gefunden wurden, werden in den Vektor uniqueNumbers kopiert, wobei die ursprüngliche Reihenfolge erhalten bleibt.
Für diejenigen ohne C 11-Unterstützung ist ein alternativer Ansatz std::remove_copy_if, was das Gegenteil von std::copy_if bewirkt. Sie würden die Logik des Prädikats umkehren (z. B. true zurückgeben, wenn ein Element gefunden wurde) und std::remove_copy_if verwenden, um Duplikate zu entfernen:
std::vector<int> uniqueNumbers; NotDuplicate<int> pred; std::remove_copy_if(numbers.begin(), numbers.end(), std::back_inserter(uniqueNumbers), std::ref(pred));
Diese Lösung bietet eine effiziente und elegante Möglichkeit, Duplikate zu entfernen und gleichzeitig die ursprüngliche Reihenfolge beizubehalten und dabei die Vielseitigkeit der STL-Algorithmen zu nutzen.
Das obige ist der detaillierte Inhalt vonWie entferne ich Duplikate aus einem unsortierten Vektor und behalte gleichzeitig die Reihenfolge in C bei?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!