Page principale | Pages associées

Le Conteneur Associatif

Le map est un fait une généralisation du set. Elle permet de gérer un ensemble de couple (clef, valeur) dont l'unicité et l'ordre sont basés uniquement sur la clef. Chaque valeur du map sera donc accessible par une clef unique. Le map est fortement lié à un objet de la STL, la pair. Une paire est tout simplement une structure stockant deux valeurs. On accède à ces valeurs par les champs first et second. Il existe même une fonction permettant de créer des paires (sinon cela devient vite pénible ) : make_pair. Une utilisation d'un map est de disposer d'un tableau indexé sur des chaînes par exemple.

#include <iostream> #include <string> #include <map>
le fichier à inclure pour utiliser les maps

using namespace std; int main() { // Création d'un map liant des chaînes à des entiers map<string,int> mStringInt; // Insertion des mois de l'année mStringInt.insert( make_pair( string("JANVIER"), 1 ) ); mStringInt.insert( make_pair( string("FEVRIER"), 2 ) ); mStringInt.insert( make_pair( string("MARS"), 3 ) ); mStringInt.insert( make_pair( string("AVRIL"), 4 ) ); mStringInt.insert( make_pair( string("MAI"), 5 ) ); mStringInt.insert( make_pair( string("JUIN"), 6 ) ); mStringInt.insert( make_pair( string("JUILLET"), 7 ) ); mStringInt.insert( make_pair( string("AOUT"), 8 ) ); mStringInt.insert( make_pair( string("SEPTEMBRE"), 9 ) ); mStringInt.insert( make_pair( string("OCTOBRE"), 10 ) ); mStringInt.insert( make_pair( string("NOVEMBRE"), 11 ) ); mStringInt.insert( map<string,int>::value_type( string("DECEMBRE"), 12 ) );
Donc pour insérer c'est insert puis make_pair ou pour les plus courageux passer par le value_type. Remarque seul le compilateur de VC++6.0 (non patché) impose l'utilisation de la forme make_pair( string("NOVEMBRE"), 11 ) tous les autres arrivent à compiler la forme make_pair( "NOVEMBRE", 11 ). Pour ce tutorial, j'ai préféré la compatibilité.

// Accéder à un élément cout << " AVRIL : " << mStringInt[ "AVRIL" ] << endl; // Rechercher un élément cout << " JULY ? " << ( mStringInt.find( "JULY" ) != mStringInt.end() ) << endl; cout << "SEPTEMBRE ? " << ( mStringInt.count( "SEPTEMBRE" ) ) << endl;
Si l'élémen recherché n'est utile pour la suite du traitement, un simple count non nul suffit pour connaître la présence de cet élément.

// Affichage de l'intégralité du map for( map<string,int>::const_iterator i = mStringInt.begin(); i != mStringInt.end(); ++i ) { cout << "Mois : " << i->first << ", Position : " << i->second << endl;
i->first correspond donc à la clef (le mois) et i->second à la valeur (la position)
} }

Le map nous a donc permis de créer facilement un tableau indexé sur des chaînes. En fait, le map peut facilement créer des tableaux indexés sur n'importe quel clef-objet sur lequel une relation d'ordre peut être établie.

La suite...


Le source complet :
#include <iostream> #include <string> #include <map> using namespace std; int main() { // Création d'un map liant des chaînes à des entiers map<string,int> mStringInt; // Insertion des mois de l'année mStringInt.insert( make_pair( string("JANVIER"), 1 ) ); mStringInt.insert( make_pair( string("FEVRIER"), 2 ) ); mStringInt.insert( make_pair( string("MARS"), 3 ) ); mStringInt.insert( make_pair( string("AVRIL"), 4 ) ); mStringInt.insert( make_pair( string("MAI"), 5 ) ); mStringInt.insert( make_pair( string("JUIN"), 6 ) ); mStringInt.insert( make_pair( string("JUILLET"), 7 ) ); mStringInt.insert( make_pair( string("AOUT"), 8 ) ); mStringInt.insert( make_pair( string("SEPTEMBRE"), 9 ) ); mStringInt.insert( make_pair( string("OCTOBRE"), 10 ) ); mStringInt.insert( make_pair( string("NOVEMBRE"), 11 ) ); mStringInt.insert( map<string,int>::value_type( string("DECEMBRE"), 12 ) ); // Accéder à un élément cout << " AVRIL : " << mStringInt[ "AVRIL" ] << endl; // Rechercher un élément cout << " JULY ? " << ( mStringInt.find( "JULY" ) != mStringInt.end() ) << endl; cout << "SEPTEMBRE ? " << ( mStringInt.count( "SEPTEMBRE" ) ) << endl; // Affichage de l'intégralité du map for( map<string,int>::const_iterator i = mStringInt.begin(); i != mStringInt.end(); ++i ) { cout << "Mois : " << i->first << ", Position : " << i->second << endl; } }
00001 #include <iostream> 00002 #include <string> 00003 #include <map> 00004 using namespace std; 00005 00006 int main() 00007 { 00008 // Création d'un map liant des chaînes à des entiers 00009 map<string,int> mStringInt; 00010 00011 // Insertion des mois de l'année 00012 mStringInt.insert( make_pair( string("JANVIER"), 1 ) ); 00013 mStringInt.insert( make_pair( string("FEVRIER"), 2 ) ); 00014 mStringInt.insert( make_pair( string("MARS"), 3 ) ); 00015 mStringInt.insert( make_pair( string("AVRIL"), 4 ) ); 00016 mStringInt.insert( make_pair( string("MAI"), 5 ) ); 00017 mStringInt.insert( make_pair( string("JUIN"), 6 ) ); 00018 mStringInt.insert( make_pair( string("JUILLET"), 7 ) ); 00019 mStringInt.insert( make_pair( string("AOUT"), 8 ) ); 00020 mStringInt.insert( make_pair( string("SEPTEMBRE"), 9 ) ); 00021 mStringInt.insert( make_pair( string("OCTOBRE"), 10 ) ); 00022 mStringInt.insert( make_pair( string("NOVEMBRE"), 11 ) ); 00023 mStringInt.insert( map<string,int>::value_type( string("DECEMBRE"), 12 ) ); 00024 // Accéder à un élément 00025 cout << " AVRIL : " << mStringInt[ "AVRIL" ] << endl; 00026 00027 // Rechercher un élément 00028 cout << " JULY ? " << ( mStringInt.find( "JULY" ) != mStringInt.end() ) << endl; 00029 cout << "SEPTEMBRE ? " << ( mStringInt.count( "SEPTEMBRE" ) ) << endl; 00030 // Affichage de l'intégralité du map 00031 for( map<string,int>::const_iterator i = mStringInt.begin(); 00032 i != mStringInt.end(); ++i ) 00033 { 00034 cout << "Mois : " << i->first << ", Position : " << i->second << endl; 00035 } 00036 }

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