Utiliser le conteneur d'ensemble STL en C++

Jinku Hu 12 octobre 2023
  1. Utilisez std::set pour déclarer Set Container Object en C++
  2. Utilisez la fonction membre insert pour insérer un élément dans un ensemble en C++
  3. Utilisez la fonction membre find pour récupérer l’itérateur de l’élément avec la clé donnée en C++
  4. Utilisez la fonction membre contains pour vérifier si l’élément avec la clé donnée existe dans un ensemble en C++
Utiliser le conteneur d'ensemble STL en C++

Cet article présentera plusieurs méthodes sur l’utilisation du conteneur STL set en C++.

Utilisez std::set pour déclarer Set Container Object en C++

La commande std::set implémente un ensemble trié d’objets uniques en tant que conteneur associatif. Les éléments sont triés avec la fonction de comparaison std::less par défaut, mais l’utilisateur peut fournir la fonction personnalisée comme deuxième argument du modèle. Le même en-tête fournit également le conteneur std::multiset qui peut stocker les valeurs multiples sans filtrer les doublons.

Notez que nous créons les deux objets set avec le constructeur de liste d’initialisation dans l’exemple suivant. Nous utilisons également la fonction membre count, qui récupère le nombre d’éléments qui existent dans l’ensemble avec la clé donnée. Cette fonction est plus intrinsèque au conteneur std::multiset, mais vous pouvez vérifier si l’élément existe avec la même fonction lorsqu’il est invoqué depuis l’objet 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;
}

Production:

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

Utilisez la fonction membre insert pour insérer un élément dans un ensemble en C++

La fonction insert a plusieurs surcharges, mais nous utilisons la version qui prend un seul argument représentant l’élément à ajouter à l’ensemble. Cette surcharge de insert renvoie l’objet std::pair de l’itérateur et le bool.

Ce dernier indique si l’insertion a réussi, et si c’est le cas, il a une valeur true. D’autre part, l’itérateur pointe sur l’élément inséré lorsque l’opération réussit. S’il échoue, il pointe vers l’élément qui a empêché l’insertion. Notez que l’opération d’insertion a une complexité logarithmique dans la taille du conteneur.

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

Production:

Inserted !Not inserted !

Utilisez la fonction membre find pour récupérer l’itérateur de l’élément avec la clé donnée en C++

La fonction find est une autre fonction membre utile du conteneur std::set qui peut renvoyer l’itérateur à l’élément avec la clé donnée. S’il n’y a pas un tel élément dans l’ensemble, l’itérateur passé à la fin est renvoyé ; cela aide l’utilisateur à vérifier l’appel de fonction réussi.

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

Production:

Found 2

Utilisez la fonction membre contains pour vérifier si l’élément avec la clé donnée existe dans un ensemble en C++

Depuis la norme du langage C++20, std::set fournit la fonction membre, contains, qui est l’interface la plus simple pour vérifier si l’élément avec la clé donnée existe dans l’objet set. La fonction renvoie la valeur booléenne pour indiquer si un tel élément est présent dans l’ensemble. La complexité du temps d’exécution de cette fonction est également logarithmique dans la taille du conteneur.

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

Production:

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