Utiliser le conteneur d'ensemble STL en C++
-
Utilisez
std::set
pour déclarer Set Container Object en C++ -
Utilisez la fonction membre
insert
pour insérer un élément dans un ensemble en C++ -
Utilisez la fonction membre
find
pour récupérer l’itérateur de l’élément avec la clé donnée en C++ -
Utilisez la fonction membre
contains
pour vérifier si l’élément avec la clé donnée existe dans un ensemble 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
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