Duplikate aus einem unsortierten Vektor entfernen
In verschiedenen Situationen ist es von entscheidender Bedeutung, die Reihenfolge des ersten Vorkommens beizubehalten und gleichzeitig Duplikate aus einem unsortierten Vektor zu entfernen. Während ein unkomplizierter Ansatz mit einem Satz und manueller Iteration effektiv ist, kann er durch die Nutzung von STL-Algorithmen verbessert werden.
Um dies zu erreichen, bietet der std::copy_if-Algorithmus eine praktische Lösung. Durch die Definition eines Prädikats, das bereits verarbeitete Elemente verfolgt und bei Duplikaten „false“ zurückgibt, können wir die gewünschten Elemente herausfiltern.
Wenn die C 11-Unterstützung nicht verfügbar ist, kann der ungeschickt benannte std::remove_copy_if verwendet werden, mit seine Logik wurde umgekehrt. Hier ist ein ungetestetes Beispiel zur Veranschaulichung:
template <typename T> struct NotDuplicate { bool operator()(const T& element) { return s_.insert(element).second; // true if s_.insert(element); } private: std::set<T> s_; };
Als nächstes kann der folgende Code verwendet werden:
std::vector<int> uniqueNumbers; NotDuplicate<int> pred; std::copy_if(numbers.begin(), numbers.end(), std::back_inserter(uniqueNumbers), std::ref(pred));
In dieser Lösung stellt std::ref sicher, dass der Stateful-Funktor dies nicht tut intern innerhalb des Algorithmus kopiert. Allerdings stellt std::copy_if keine Anforderungen an Nebenwirkungen des angewendeten Funktors.
Das obige ist der detaillierte Inhalt vonWie entferne ich Duplikate aus einem unsortierten Vektor und behalte dabei die Ordnung bei?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!