Entfernen Sie Duplikate aus dem Vektor in C++

Jinku Hu 12 Oktober 2023
  1. Verwenden Sie die Funktionen std::unique und std::vector::erase, um Duplikate aus C++-Vektoren zu entfernen
  2. Verwenden Sie den Container std::set, um Duplikate aus dem C++-Vektor zu entfernen
Entfernen Sie Duplikate aus dem Vektor in C++

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;
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

Verwandter Artikel - C++ Vector