Usa il contenitore del set STL in C++

Jinku Hu 12 ottobre 2023
  1. Usa std::set per dichiarare Set Container Object in C++
  2. Usa la funzione membro insert per inserire un elemento nel set in C++
  3. Usa la funzione membro find per recuperare l’iteratore dell’elemento con la chiave data in C++
  4. Usa la funzione membro contains per verificare se l’elemento con la chiave data esiste in un insieme in C++
Usa il contenitore del set STL in C++

Questo articolo dimostrerà più metodi su come utilizzare il contenitore STL set in C++.

Usa std::set per dichiarare Set Container Object in C++

Il comando std::set implementa un insieme ordinato di oggetti univoci come contenitore associativo. Gli elementi vengono ordinati con la funzione di confronto std::less per impostazione predefinita, ma l’utente può fornire la funzione personalizzata come secondo argomento del modello. La stessa intestazione fornisce anche il contenitore std::multiset che può memorizzare più valori senza filtrare i duplicati.

Si noti che nell’esempio seguente creiamo entrambi gli oggetti set con il costruttore della lista di inizializzazione. Utilizziamo anche la funzione membro count, che recupera il numero di elementi che esistono nell’insieme con la chiave data. Questa funzione è più intrinseca al contenitore std::multiset, ma è possibile verificare se l’elemento esiste con la stessa funzione quando viene invocato dall’oggetto std::set.

#include <iostream>
#include <set>

using std::cout;
using std::endl;
using std::multiset;
using std::set;

template <typename T>
void printSet(set<T> s) {
  for (const auto &item : s) {
    cout << item << "; ";
  }
  cout << endl;
}

template <typename T>
void printMultiSet(multiset<T> s) {
  for (const auto &item : s) {
    cout << item << "; ";
  }
  cout << endl;
}

#define STR(num) #num

int main() {
  std::set<int> s1 = {1, 1, 1, 2, 2, 3};
  printSet(s1);

  std::multiset<int> s2 = {1, 1, 1, 2, 2, 3};
  printMultiSet(s2);
  std::cout << STR(s2) << " contains " << s2.count(1) << "ones" << endl;
  std::cout << STR(s2) << " contains " << s2.count(2) << "twos" << endl;

  return EXIT_SUCCESS;
}

Produzione:

1;
2;
3;
1;
1;
1;
2;
2;
3;
s2 contains 3 ones s2 contains 2 twos

Usa la funzione membro insert per inserire un elemento nel set in C++

La funzione insert ha più overload, ma utilizziamo la versione che accetta un singolo argomento che rappresenta l’elemento da aggiungere al set. Questo sovraccarico di insert restituisce l’oggetto std::pair dell’iteratore e il bool.

Quest’ultimo indica se l’inserimento è andato a buon fine e, in caso affermativo, ha un valore true. D’altra parte, l’iteratore punta all’elemento inserito quando l’operazione ha esito positivo. Se fallisce, punta all’elemento che ha impedito l’inserimento. Si noti che l’operazione di inserimento ha una complessità logaritmica nella dimensione del contenitore.

#include <cassert>
#include <iostream>
#include <set>

using std::cout;
using std::endl;
using std::multiset;
using std::set;

int main() {
  std::set<int> s1 = {1, 1, 1, 2, 2, 3};

  auto ret = s1.insert(5);
  assert(*ret.first == 5);
  if (ret.second) std::cout << "Inserted!" << endl;

  ret = s1.insert(1);
  assert(*ret.first == 1);
  if (!ret.second) std::cout << "Not inserted!" << endl;

  return EXIT_SUCCESS;
}

Produzione:

Inserted !Not inserted !

Usa la funzione membro find per recuperare l’iteratore dell’elemento con la chiave data in C++

La funzione find è un’altra utile funzione membro del container std::set che può restituire l’iteratore all’elemento con la chiave data. Se non c’è tale elemento nel set, viene restituito l’iteratore passato la fine; questo aiuta l’utente a verificare la corretta chiamata di funzione.

#include <iostream>
#include <set>

using std::cout;
using std::endl;
using std::multiset;
using std::set;

int main() {
  std::set<int> s1 = {1, 1, 1, 2, 2, 3};

  auto search = s1.find(2);
  if (search != s1.end()) {
    cout << "Found " << (*search) << endl;
  } else {
    cout << "Not found" << endl;
  }

  return EXIT_SUCCESS;
}

Produzione:

Found 2

Usa la funzione membro contains per verificare se l’elemento con la chiave data esiste in un insieme in C++

Poiché lo standard del linguaggio C++20, std::set fornisce la funzione membro, contains, che è l’interfaccia più semplice per verificare se l’elemento con la chiave data esiste nell’oggetto set. La funzione restituisce il valore booleano per indicare se tale elemento è presente nell’insieme. La complessità del tempo di esecuzione di questa funzione è anche logaritmica nella dimensione del contenitore.

#include <iostream>
#include <set>

using std::cout;
using std::endl;
using std::multiset;
using std::set;

int main() {
  std::set<int> s3 = {91, 123, 63, 122, 22, 53};

  for (int x : {22, 23, 53, 54}) {
    if (s3.contains(x)) {
      cout << x << ": Found\n";
    } else {
      cout << x << ": Not found\n";
    }
  }

  return EXIT_SUCCESS;
}

Produzione:

22 : Found 23 : Not found 53 : Found 54 : Not found
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++ Set