Entfernen Sie Duplikate aus dem Vektor in C++
-
Verwenden Sie die Funktionen
std::unique
undstd::vector::erase
, um Duplikate aus C++-Vektoren zu entfernen -
Verwenden Sie den Container
std::set
, um Duplikate aus dem C++-Vektor zu entfernen
In diesem Artikel wird vorgestellt, wie Duplikate aus einem Vektor in C++ entfernt werden.
Verwenden Sie die Funktionen std::unique
und std::vector::erase
, um Duplikate aus C++-Vektoren zu entfernen
Die Funktion std::unique
ist Teil der STL-Algorithmen und implementiert im Wesentlichen eine Operation zum Entfernen doppelter Elemente in sortierten Bereichen. Elemente werden nach jedem Entfernen verschoben, und die Funktion gibt den Iterator nach dem Ende für den neu gebildeten Bereich zurück. Die Überladung std::unique
, die wir im folgenden Beispielcode verwenden, benötigt zwei Iteratorargumente, um den Anfang und das Ende des Bereichs anzugeben. Auch in diesem Fall sortieren wir den gegebenen Vektor
mit dem std::sort
-Algorithmus, bevor er mit std::unique
verarbeitet wird. Schließlich wird die Member-Funktion erase
aufgerufen, um die ursprüngliche Array-Größe an den neu gebildeten Vektor anzupassen.
#include <algorithm>
#include <iomanip>
#include <iostream>
#include <iterator>
#include <vector>
using std::copy;
using std::cout;
using std::endl;
using std::left;
using std::setw;
using std::vector;
int main() {
vector<int> int_vec = {10, 23, 10, 324, 10, 10, 424,
649, 110, 110, 129, 40, 424};
cout << left << setw(10) << "vec: ";
copy(int_vec.begin(), int_vec.end(), std::ostream_iterator<int>(cout, "; "));
cout << endl;
std::sort(int_vec.begin(), int_vec.end());
auto last = std::unique(int_vec.begin(), int_vec.end());
int_vec.erase(last, int_vec.end());
cout << left << setw(10) << "vec: ";
copy(int_vec.begin(), int_vec.end(), std::ostream_iterator<int>(cout, "; "));
cout << endl;
return EXIT_SUCCESS;
}
Ausgabe:
vec: 10; 23; 10; 324; 10; 10; 424; 649; 110; 110; 129; 40; 424;
vec: 10; 23; 40; 110; 129; 324; 424; 649;
Eine andere Methode, um die vorherige Lösung zu implementieren, besteht darin, die Funktion resize
anstelle des Aufrufs erase
zu verwenden. Die Funktion resize
ändert die Elementanzahl des Vektors. So können wir die berechnete Anzahl neu gebildeter Vektorelemente mit dem Aufruf distance
übergeben, und resize
verkleinert den Vektor.
#include <algorithm>
#include <iomanip>
#include <iostream>
#include <iterator>
#include <vector>
using std::copy;
using std::cout;
using std::endl;
using std::left;
using std::setw;
using std::vector;
int main() {
vector<int> int_vec = {10, 23, 10, 324, 10, 10, 424,
649, 110, 110, 129, 40, 424};
cout << left << setw(10) << "vec: ";
copy(int_vec.begin(), int_vec.end(), std::ostream_iterator<int>(cout, "; "));
cout << endl;
std::sort(int_vec.begin(), int_vec.end());
auto last = std::unique(int_vec.begin(), int_vec.end());
int_vec.resize(std::distance(int_vec.begin(), last));
cout << left << setw(10) << "vec: ";
copy(int_vec.begin(), int_vec.end(), std::ostream_iterator<int>(cout, "; "));
cout << endl;
return EXIT_SUCCESS;
}
Ausgabe:
vec: 10; 23; 10; 324; 10; 10; 424; 649; 110; 110; 129; 40; 424;
vec: 10; 23; 40; 110; 129; 324; 424; 649;
Verwenden Sie den Container std::set
, um Duplikate aus dem C++-Vektor zu entfernen
Alternativ kann der Container std::set
verwendet werden, um doppelte Elemente aus dem Vektor zu entfernen. Beachten Sie, dass std::set
intern ein eindeutiges Objekt des angegebenen Typs speichert, also müssen wir eines aus Vektorelementen konstruieren. Sobald das set
mit zu sortierenden Vektorelementen initialisiert ist, können wir die Funktion assign
vom ursprünglichen vector
-Objekt aufrufen, um eindeutige Elemente aus dem set
-Objekt zu speichern.
#include <algorithm>
#include <iomanip>
#include <iostream>
#include <iterator>
#include <set>
#include <vector>
using std::copy;
using std::cout;
using std::endl;
using std::left;
using std::set;
using std::setw;
using std::vector;
int main() {
vector<int> int_vec = {10, 23, 10, 324, 10, 10, 424,
649, 110, 110, 129, 40, 424};
cout << left << setw(10) << "vec: ";
copy(int_vec.begin(), int_vec.end(), std::ostream_iterator<int>(cout, "; "));
cout << endl;
set<int> int_set(int_vec.begin(), int_vec.end());
int_vec.assign(int_set.begin(), int_set.end());
cout << left << setw(10) << "vec: ";
copy(int_vec.begin(), int_vec.end(), std::ostream_iterator<int>(cout, "; "));
cout << endl;
return EXIT_SUCCESS;
}
Ausgabe:
vec: 10; 23; 10; 324; 10; 10; 424; 649; 110; 110; 129; 40; 424;
vec: 10; 23; 40; 110; 129; 324; 424; 649;
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook