Supprimer les doublons du vecteur en C++

Jinku Hu 12 octobre 2023
  1. Utilisez les fonctions std::unique et std::vector::erase pour supprimer les doublons du vecteur C++
  2. Utilisez le conteneur std::set pour supprimer les doublons du vecteur C++
Supprimer les doublons du vecteur en C++

Cet article présentera comment supprimer les doublons d’un vecteur en C++.

Utilisez les fonctions std::unique et std::vector::erase pour supprimer les doublons du vecteur C++

La fonction std::unique fait partie des algorithmes STL, et elle implémente essentiellement une opération de suppression d’éléments en double sur des plages triées. Les éléments sont décalés après chaque suppression, et la fonction renvoie l’itérateur au-delà de la fin pour la plage nouvellement formée. La surcharge std::unique que nous utilisons dans l’exemple de code suivant prend deux arguments d’itérateur pour indiquer le début et la fin de la plage. Dans ce cas, nous trions également le vector donné avec l’algorithme std::sort avant qu’il ne soit traité avec std::unique. Enfin, la fonction membre erase est appelée pour modifier la taille du tableau d’origine pour s’adapter au vecteur nouvellement formé.

#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;
}

Production:

vec:      10; 23; 10; 324; 10; 10; 424; 649; 110; 110; 129; 40; 424;
vec:      10; 23; 40; 110; 129; 324; 424; 649;

Une autre méthode pour implémenter la solution précédente consiste à utiliser la fonction resize au lieu de l’appel erase. La fonction resize modifie le nombre d’éléments du vecteur. Ainsi, nous pouvons transmettre le nombre calculé d’éléments vectoriels nouvellement formés en utilisant l’appel distance, et resize rétrécira le vecteur.

#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;
}

Production:

vec:      10; 23; 10; 324; 10; 10; 424; 649; 110; 110; 129; 40; 424;
vec:      10; 23; 40; 110; 129; 324; 424; 649;

Utilisez le conteneur std::set pour supprimer les doublons du vecteur C++

Alternativement, le conteneur std::set peut être utilisé pour supprimer les éléments en double du vecteur. Notez que std::set stocke en interne un objet unique du type donné, nous devons donc en construire un à partir d’éléments vectoriels. Une fois le set initialisé avec les éléments vectoriels à trier, nous pouvons appeler la fonction assign à partir de l’objet vector d’origine pour stocker les éléments uniques de l’objet set.

#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;
}

Production:

vec:      10; 23; 10; 324; 10; 10; 424; 649; 110; 110; 129; 40; 424;
vec:      10; 23; 40; 110; 129; 324; 424; 649;
Auteur: 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

Article connexe - C++ Vector