Page principale | Pages associées

Les Ensembles

Le set est le premier conteneur que je présenterais de la catégorie des conteneurs associatifs (même si la notion d'association n'est pas évidente ici) Un set permet de gérer un ensemble (au sens ensembliste - unicité) d'éléments à l'aide d'un critère de recherche (l'équivalence).

#include <iostream> #include <set>
le fichier à include pour utiliser les ensembles

using namespace std; int main() { // Création d'un ensemble de caractères set<char> sChar; // Ajouter des caractères sChar.insert( 'F' ); sChar.insert( 'C' ); sChar.insert( 'A' ); sChar.insert( 'D' );
Pour une insertion dans un set il n'est pas nécessaire de préciser une position. L'élément se placera à sa place selon le critère de tri du set.

// Afficher les éléments du set for( set<char>::const_iterator i = sChar.begin(); i !=sChar.end(); ++i ) { cout << *i << ' ';
Vous auriez pu normalement écrire cette boucle tout(e) seul(e)
} cout << endl;
On ne saute la ligne qu'à la fin pour ne pas trop écrire On notera que l'affichage des éléments ( A C D F ) ne correspond pas à l'ordre d'insertion dans le set ( F C A D ). Ainsi le set reste trié dès qu'un nouvel élément y est ajouté.

// Comptage cout << "Nb de D : " << sChar.count( 'D' ) << endl; cout << "Nb de B : " << sChar.count( 'B' ) << endl;
Le set permet de compter le nombre d'occurence d'un élément ici D = 1 et B = 0. Dans un set, le résultat attendu est soit 0 soit 1.

// Recherche cout << "F trouvé ? " << ( sChar.find( 'F' ) != sChar.end() ) << endl; cout << "B trouvé ? " << ( sChar.find( 'B' ) != sChar.end() ) << endl;
La méthode find() permet donc de rechercher un caractère dans l'ensemble et renvoie un itérateur sur sa position dans le set. Il suffit de comparer cet itérateur avec l'itérateur de fin du set pour savoir si cet élément a été trouvé ou non.

// Pour vérifier le tout sChar.insert( 'B' ); sChar.insert( 'F' ); sChar.insert( 'E' );
On ajoute un B, un F et un E au set. Le B et E n'existant pas il devrait être ajouté après le A et le D Le F existe déjà, il ne sera pas inséré car il n'y a pas de doublon dans un set.

// Afficher les éléments du set après l'insertion for( set<char>::const_iterator j = sChar.begin(); j !=sChar.end(); ++j ) { cout << *j << ' '; } cout << endl;
Comme prévu, l'affichage nous donne bien A B C D E F
}

Cette présentation du set nous à fait découvrir le premier conteneur gérant de manière complexe l'insertion d'un élément. Pour la première fois, nous disposons d'une méthode (et non pas d'un algorithme STL) afin de rechercher et de compter les élements. De plus, on le verra peut être plus tard, la STL dispose d'algorithme spécialement dédié pour la manipulation de ces conteneurs triés : includes, set_union, set_intersection, set_difference, ...

J'en ai parlé rapidement au début mais la critère par défaut est < (less) ce qui laisse sous entendre qu'on peut le changer Essayez de changer la ligne 22 de ce programme par set<char, greater<char> > sChar; La notation laisse entrevoir qu'au lieu d'avoir set<char, less<char> > sChar; donc less nous avons changé le tri par > (greater). Après la modification vous verrez le set est trié dans l'autre sens et que l'affichage final nous donne : F E D C B A

La suite...


Le source complet :
#include <iostream> #include <set> using namespace std; int main() { // Création d'un ensemble de caractères set<char> sChar; // Ajouter des caractères sChar.insert( 'F' ); sChar.insert( 'C' ); sChar.insert( 'A' ); sChar.insert( 'D' ); // Afficher les éléments du set for( set<char>::const_iterator i = sChar.begin(); i !=sChar.end(); ++i ) { cout << *i << ' '; } cout << endl; // Comptage cout << "Nb de D : " << sChar.count( 'D' ) << endl; cout << "Nb de B : " << sChar.count( 'B' ) << endl; // Recherche cout << "F trouvé ? " << ( sChar.find( 'F' ) != sChar.end() ) << endl; cout << "B trouvé ? " << ( sChar.find( 'B' ) != sChar.end() ) << endl; // Pour vérifier le tout sChar.insert( 'B' ); sChar.insert( 'F' ); sChar.insert( 'E' ); // Afficher les éléments du set après l'insertion for( set<char>::const_iterator j = sChar.begin(); j !=sChar.end(); ++j ) { cout << *j << ' '; } cout << endl; }
00001 #include <iostream> 00002 #include <set> 00003 using namespace std; 00004 00005 int main() 00006 { 00007 // Création d'un ensemble de caractères 00008 set<char> sChar; 00009 00010 // Ajouter des caractères 00011 sChar.insert( 'F' ); 00012 sChar.insert( 'C' ); 00013 sChar.insert( 'A' ); 00014 sChar.insert( 'D' ); 00015 // Afficher les éléments du set 00016 for( set<char>::const_iterator i = sChar.begin(); i !=sChar.end(); ++i ) 00017 { 00018 cout << *i << ' '; 00019 } 00020 cout << endl; 00021 // Comptage 00022 cout << "Nb de D : " << sChar.count( 'D' ) << endl; 00023 cout << "Nb de B : " << sChar.count( 'B' ) << endl; 00024 // Recherche 00025 cout << "F trouvé ? " << ( sChar.find( 'F' ) != sChar.end() ) << endl; 00026 cout << "B trouvé ? " << ( sChar.find( 'B' ) != sChar.end() ) << endl; 00027 // Pour vérifier le tout 00028 sChar.insert( 'B' ); 00029 sChar.insert( 'F' ); 00030 sChar.insert( 'E' ); 00031 // Afficher les éléments du set après l'insertion 00032 for( set<char>::const_iterator j = sChar.begin(); j !=sChar.end(); ++j ) 00033 { 00034 cout << *j << ' '; 00035 } 00036 cout << endl; 00037 }

Dernière modification : Sun Jul 4 20:19:13 2004