Rimuovi i duplicati dal vettore in C++

Jinku Hu 12 ottobre 2023
  1. Usa le funzioni std::unique e std::vector::erase per rimuovere i duplicati dal vettore C++
  2. Usa il contenitore std::set per rimuovere i duplicati dal vettore C++
Rimuovi i duplicati dal vettore in C++

Questo articolo introdurrà come rimuovere i duplicati da un vettore in C++.

Usa le funzioni std::unique e std::vector::erase per rimuovere i duplicati dal vettore C++

La funzione std::unique fa parte degli algoritmi STL e sostanzialmente implementa un’operazione di rimozione di elementi duplicati su intervalli ordinati. Gli elementi vengono spostati dopo ogni rimozione e la funzione restituisce l’iteratore passato alla fine per l’intervallo appena formato. L’overload std::unique che utilizziamo nel codice di esempio seguente accetta due argomenti dell’iteratore per denotare l’inizio e la fine dell’intervallo. In questo caso, ordiniamo anche il vettore dato con l’algoritmo std::sort prima che venga elaborato con std::unique. Infine, viene chiamata la funzione membro erase per modificare la dimensione dell’array originale per adattarla al vettore appena formato.

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

Produzione:

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

Un altro metodo per implementare la soluzione precedente è utilizzare la funzione resize invece della chiamata erase. La funzione resize modifica il conteggio degli elementi del vettore. Quindi, possiamo passare il conteggio calcolato degli elementi del vettore appena formati usando la chiamata distance, e resize ridurrà il vettore.

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

Produzione:

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

Usa il contenitore std::set per rimuovere i duplicati dal vettore C++

In alternativa, il contenitore std::set può essere utilizzato per rimuovere elementi duplicati dal vettore. Nota che std::set memorizza internamente un oggetto univoco del tipo dato, quindi dobbiamo costruirne uno da elementi vettoriali. Una volta che il set è stato inizializzato con elementi vettoriali che devono essere ordinati, possiamo chiamare la funzione assign dall’oggetto vector originale per memorizzare elementi univoci dall’oggetto 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;
}

Produzione:

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

Articolo correlato - C++ Vector