begin process at 2012 02 09 15:01:29
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Divers

 > MAP STL ET ARBRES ROUGES ET NOIRS

MAP STL ET ARBRES ROUGES ET NOIRS


 Information sur la source

Note :
Aucune note
Catégorie :Divers Classé sous :MAP, arbres, STL, conteneur Niveau :Débutant Date de création :26/04/2009 Vu :2 513

Auteur : guill76

Ecrire un message privé
Commentaire sur cette source (2)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
Ce bout de code est fait dans le but de faire découvrir les propriétés d'indexation des MAPs de la STL.
Une map est en fait un arbre rouge et noir dont le principal but est d'optimiser les recherches d'éléments ( c'est un peu le même concept qu'un index en terme de base de données).

On observera donc ici qu'une map ne peut pas être mélangée dans un ordre aléatoire, qu'une map ne peut pas être triée dans un ordre différent de celui établi à son initialisation.  

Ce code permet d'afficher la structure sous forme de _RB_Tree_node. Il requiert pour visualiser le résultat l'utilitaire libre graphviz.

Source

  • #include <map>
  • #include <iostream>
  • #include <fstream>
  • #include <sstream>
  • #include <string>
  • using namespace std;
  • #define _mCAST static_cast<NODE>
  • typedef map<int,string> mapTree ;
  • typedef pair<int,string> PAIR ;
  • typedef _Rb_tree_node<PAIR>::_Link_type NODE ;
  • /**
  • *
  • * Qq fonctions auxilliaires
  • *
  • */
  • string i2str( long int i ) { ostringstream oss ; oss<<i; return oss.str() ; }
  • long int str2i( string ent ) { return atoi( ent.c_str() ); }
  • NODE left(NODE node) { return ( _mCAST( node->_M_left ) ) ; }
  • NODE parent(NODE node) { return ( _mCAST( node->_M_parent ) ) ; }
  • NODE right(NODE node) { return ( _mCAST( node->_M_right ) ); }
  • NODE getNode( mapTree::iterator it ) { return _mCAST( it._M_node ) ; }
  • bool isLeaf(NODE node) { return ( !left( node ) && !right( node ) ) ; }
  • string getColor( NODE node ) { return ( ( node->_M_color )? "black" : "red" ); }
  • void infoDot( mapTree::iterator it, ofstream& f ) {
  • NODE node = getNode( it ) ; ostringstream ossaddr ;
  • string tmp = "", tmpL = "", tmpR="" ; string position = "" ;
  • if ( f.is_open() ) {
  • if ( node ) {
  • ossaddr << "\"" << (node) << "\"" ;
  • tmp = ossaddr.str() ;
  • if ( !isLeaf( node ) ) { f << tmp << "[shape=\"triangle\"];" << endl ; }
  • if ( left( node ) ) { ossaddr.str( "" ) ;
  • ossaddr << "\"" << left( node ) << "\"" ; tmpL = ossaddr.str() ;
  • f << tmp << "->" << tmpL << ";" << endl ;
  • }
  • if ( right( node ) ) { ossaddr.str( "" ) ;
  • ossaddr << "\"" << right( node ) << "\"" ; tmpR = ossaddr.str() ;
  • f << tmp << "->" << tmpR << ";" << endl ;
  • }
  • f << tmp << "[label=\"" << node->_M_value_field.first << "\\n" ;
  • f << node->_M_value_field.second << "\"];" << endl ;
  • f << tmp << "[color=\"" << getColor( node )<< "\"];" << endl ;
  • ossaddr.str( "" ) ;
  • }
  • }
  • }
  • void mapToDot( mapTree mp, string filename ) { mapTree::iterator it = mp.begin() ;
  • ofstream ofile( filename.c_str() );
  • if (ofile.is_open()) {
  • ofile << "digraph DG {" << endl ; ofile << "size=\"10,10\";" << endl ;
  • while( it != mp.end() ) { infoDot( it, ofile ) ; ++it ; }
  • ofile<<"}"<<endl;
  • }
  • ofile.close();
  • }
  • int main()
  • {
  • mapTree myMap ;
  • mapTree::iterator it=myMap.begin();
  • int entier=0;
  • for ( entier=1;entier<30;entier++)
  • it = myMap.insert( it, make_pair( entier, "entier"+i2str(entier)) );
  • mapToDot( myMap, "mymap.dot" ) ;
  • // Si graphviz installé
  • system ("dotty mymap.dot");
  • }
#include <map>
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
using namespace std;
#define _mCAST static_cast<NODE>


typedef map<int,string> mapTree ;
typedef pair<int,string> PAIR ;
typedef _Rb_tree_node<PAIR>::_Link_type NODE ;

/**
*
* Qq fonctions auxilliaires
*
*/
string i2str( long int i ) {	ostringstream oss ; oss<<i; return oss.str() ; }
long int str2i( string ent ) { return atoi( ent.c_str() ); }
NODE left(NODE node) { return ( _mCAST( node->_M_left ) ) ; }
NODE parent(NODE node) { return ( _mCAST( node->_M_parent ) ) ; }
NODE right(NODE node) { return ( _mCAST( node->_M_right ) ); }
NODE getNode( mapTree::iterator it ) { return _mCAST( it._M_node ) ; }
bool isLeaf(NODE node) { return ( !left( node ) && !right( node ) ) ; }
string getColor( NODE node ) { return ( ( node->_M_color )? "black" : "red" ); }

void infoDot( mapTree::iterator it, ofstream& f ) {
  NODE node = getNode( it ) ; ostringstream ossaddr ;
  string tmp = "", tmpL = "", tmpR="" ; string position = "" ;
  if ( f.is_open() ) {
    if ( node ) {
      ossaddr << "\"" << (node) << "\"" ;
      tmp = ossaddr.str() ;
      if ( !isLeaf( node ) ) { f << tmp << "[shape=\"triangle\"];" << endl ; }
      if ( left( node ) ) { ossaddr.str( "" ) ; 
        ossaddr << "\"" << left( node ) << "\"" ; tmpL = ossaddr.str() ;
        f << tmp << "->" << tmpL << ";" << endl ;        
      }
      if ( right( node ) ) { ossaddr.str( "" ) ; 
        ossaddr << "\"" << right( node ) << "\"" ; tmpR = ossaddr.str() ;
        f << tmp << "->" << tmpR << ";" << endl ;
      }
      f << tmp << "[label=\"" << node->_M_value_field.first << "\\n" ;
      f << node->_M_value_field.second << "\"];" << endl ;
      f << tmp << "[color=\"" << getColor( node )<< "\"];" << endl ;
      ossaddr.str( "" ) ;
    }
  }
}

void mapToDot( mapTree mp, string filename ) { mapTree::iterator it = mp.begin() ;
  ofstream ofile( filename.c_str() );
  if (ofile.is_open()) {        
    ofile << "digraph DG {" << endl ; ofile << "size=\"10,10\";" << endl ;
    while( it != mp.end() ) { infoDot( it, ofile ) ; ++it ; }
    ofile<<"}"<<endl;
  }
  ofile.close();
}




int main()
{
  mapTree myMap ;
  mapTree::iterator it=myMap.begin();
  int entier=0;
  for ( entier=1;entier<30;entier++)
  it = myMap.insert( it, make_pair( entier, "entier"+i2str(entier)) );
  mapToDot( myMap, "mymap.dot" ) ;
  // Si graphviz installé
  system ("dotty mymap.dot");
}

 Conclusion

J'ai fait ce code pour étudier un peu plus les maps car je l'ai utilisées sans vraiment les connaître.
Jusqu'au jour où j'ai voulu en trier une dans un ordre différent: sans résultats.
J'ai donc cherché le pourquoi dans l'entête  stl_tree.h et ça m'a amené    vers les arbres rouges et noirs que je ne connaissais pas.
Donc voilà si ça peut aider certains débutants comme moi.


 Sources du même auteur

DATETIMECONVERTER
TABLEAUX DE CHAINES DE CARACTÈRE: FONCTIONS IMPLODE, EXPLODE...

 Sources de la même categorie

Source avec Zip ÉDITEUR DE RECTANGLES EN CONSOLE par seoseo
CONVERSION DE FICHIER EN FICHIER BMP par seoseo
Source avec Zip DETECTEUR EJP par idpro
Source avec Zip Source avec une capture SHOP MANAGER CONSOLE SUR WINDOWS par antho974
Source avec Zip JOUR DE NAISSANCE par fredg19

 Sources en rapport avec celle ci

PERFORMANCE DE DIFFÉRENTS CONTAINERS DE LA STL par TeddyBear94
Source avec Zip CALLOCATOR par troctsch
Source avec Zip Source avec une capture MAP_MAKER_JEU par seekplus
Source avec Zip Source avec une capture 2D GAME DIRECT X 9 par nanonavich
Source avec une capture CALCUL DE L'ENVELOPPE CONVEXE D'UN NUAGE DE POINTS DANS UN P... par Lucky92

Commentaires et avis

Commentaire de tibur le 05/05/2009 01:02:45

Excellent !
Je te remercie bien, ça m'évitera des explications à un stagiaire qui était persuadé qu'une map était en accès direct. Sympa la sortie en graphviz.
Personne n'avait commenté cette source. Me voilà, et mon dix sur dix.

Commentaire de guill76 le 07/05/2009 16:48:42

Bonjour,
Merci et content que ça puisse être utile à quelqu'un :)

Je voulais aussi ajouter un truc que j'avais oublié mais j'arrive pas à modifier le code : pas de bouton terminer pour valider(visible sous IE 6), je pense que c'est un petit bug de CS.

Je voulais en fait montrer les particularité du "sommet de la map" [ici l'lement de clé 8 dans l'exemple de la capture] qui en fait est lié par son parent au noeud pointé par l'iterateur end()(donc le vrai sommet)
le noeud du end lui pointe à gauche sur le begin() (le minimum de la map) et à droite sur le maximum.  
je compléterai la source dès que je pourrais à nouveau valider la modification.      

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

comment inclure un conteneur dans une classe [ par kharrat ] Salut,Je cherche d&#233;sesp&#233;r&#233;ment &#224; cr&#233;er une classe qui a un conteneur map pour faire un carnet d'adresse (je m'amuse comme je parcours MAP STL [ par Sk8yo ] bonjour,j'utilise une structure map.je la parcours et j' "erase()" a la volée est ce que cela est correct ou est ce que je fais une grosse bétise?parc STL map et plusieurs types de valeurs ? [ par RV2931 ] Bonjour à tous,J'ai découvert récemment les STL C++ car je souhaite retrouver un outils permettant de retrouver la puissance et la flexibilité des tab Conteneur map [ par daddycool76 ] Bonjour, je débute en c++ et je morfle pas mal.Voila mon problème : je souhaite stocker des objets dans un conteneur map (là ça va..). J'aimerai ensui Lecture fichier impossible avec SDL [ par CCJ ] Hello.j'utilise SDL pour me faire un petit jeu 2D. Seulement je recontre actuellement un petit probleme. Il semblerait en effet qu'il bloque l'utilisa Question instanciation [ par statquant ] Hello Je me pose une petite question. La classe ci dessous possede une methode public inlinée( on s'en fout) et static qui s'appelle GetInstance() 1. juste une question [ par lespleiades ] salut tt le monde^^, bon en fait j'ai une question qui me trotte dans la tete depuis plusieurs jours (je ne connais pas le C++ et je n'ai aucuns proje cpp template et map [ par sebome ] Bonjour à tous.Je me suis lancé a faire un petit programme pour apprendre a me servir des map.J'ai essayé aussi de faire des fonctions template pour a sauvegarder une map sur fichier borland c++ [ par treets ] Bonjour à tous,je suis en train de développer une application windows de gestion d'accès pour un ensemble de batiments.J'ai une classe PERSONNEL et un Effacer élement liste stl [ par poiuytrez3 ] Bonjour,J'utilise depuis très peu de temps la stl.J'ai un problème lors de la suppression d'un élément d'une liste.Voici mon problème : J'ai une liste


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,624 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales