Heim > Backend-Entwicklung > C++ > Wie entferne ich Duplikate aus einem unsortierten Vektor und behalte gleichzeitig die Reihenfolge in C bei?

Wie entferne ich Duplikate aus einem unsortierten Vektor und behalte gleichzeitig die Reihenfolge in C bei?

Mary-Kate Olsen
Freigeben: 2024-11-14 09:44:02
Original
457 Leute haben es durchsucht

How to Remove Duplicates from an Unsorted Vector while Preserving Order in C  ?

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_;
};
Nach dem Login kopieren

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));
Nach dem Login kopieren

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));
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage