IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

multimap et equal_range


Sujet :

C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre �prouv�
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    109
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 109
    Par d�faut multimap et equal_range
    Bonsoir,

    J'ai une multimap de type :
    pour faire un m�diateur.

    A �tant une classe de base virtuelle ayant notamment une donn�e membre qui me permet d'�tablir une relation d'ordre.
    Soient B, C des classes filles.

    J'ai donc d�fini un operator < ( qui s'appuie sur le nom name) et tout marche bien quand je veux r�cup�rer une clef pr�cise.


    Seulement voil�, je voudrai savoir s'il y a moyen d'utiliser un equal_range qui ne s'appuie pas sur cet op�rateur < qui me permettrait par exemple d'afficher que les objets de type B*.


    J'aimerai donc �viter du code comme ceci :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    typedef multimap<A*,A*> listA;
    typedef listA :: const_iterator MIT;
     
    for (MIT mit = listA.begin(); mit != listA.end(); ++mit) {
              const pair<const A*,const A*> p = *mit; 
              if (dynamic_cast<const B*>(p.first))  p.second->display(); // ParEx
              };
     
    // Un peu embêtant quand il n'y a que 3 ou 4 objets concernés sur 150 :((
    et avoir plut�t :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
     
    pair<MIT,MIT> p = listA.equal_range(/* objet foncteur approprié? */);
    for (MIT mit=p.first;mit!=p.second;++mit) mit->second->display();
    J'ai bien pens� � une solution genre :
    - Oh ben suffit de faire commencer les noms de la classe A par "A" etc... mais bon c'est pas tr�s fiable ... et je suis s�r qu'il y a une fa�on propre et efficace .

  2. #2
    Expert confirm�
    Avatar de Luc Hermitte
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2003
    Messages
    5 296
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : A�ronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Ao�t 2003
    Messages : 5 296
    Par d�faut
    J'imagine que tu avais oubli� de pr�ciser la fonction de comparaison dans la d�finition de ta table.
    Sinon, comme �a au hasard (j'ai lu en diagonale, je l'avoue), boost.multi_index peut-�tre ?
    Sinon, recopier tes donn�es (des pointeurs ici) dans un set tri� suivant ton autre crit�re -- ou faire une copie � plat dans un vecteur et appliquer un std::sort par dessus -- si tant est qu'il n'existe pas une fonction qui permettra de trier le strict minnimum pour extraire exactement ce qui t'interresse.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne r�ponds � aucune question technique par le biais de ce m�dia. Et de toutes fa�ons, ma BAL sur dvpz est pleine...

  3. #3
    R�dacteur/Mod�rateur
    Avatar de JolyLoic
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2004
    Messages
    5 463
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 51
    Localisation : France, Yvelines (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 5 463
    Par d�faut
    L'efficacit� d'equal_range vient du fait qu'il travaille sur une collection tri�e. Or si tu as d�j� choisi de trier ta map autrement, tant pis, tu n'as qu'un ordre de tri par map.

    Quelques pistes, au hasard :

    - Stocker les r�sultats de ton algorithme lourd dans un vector<map<A*, A*>::iterator> pour avoir les r�sultats en m�moire le coup d'apr�s
    - Utiliser un conteneur avec plusieurs ordres de classement possible, comme bost::multi-index.
    Ma session aux Microsoft TechDays 2013 : D�velopper en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage � la d�couverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'h�sitez pas � me contacter.

  4. #4
    Membre �prouv�
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    109
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 109
    Par d�faut
    Oui absolument, c'�tait pour simplifier mon post.

    J'ai d�fini ceci :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    // C'est cette structure qui va me servir de comparaison
    struct CompareA{
            bool operator() (const A*,const A*) const;
            };
     
     
     class A {
     private :
         string name;
    /*...*/
     
     public :
    /*...*/
     string getName() const           { return name; }
     
    // Les classes B et C ont aussi cet opérator < de défini
     template <typename T> bool operator <  (const T& a) const  { return getName() < a.getName(); }
     };
     
    inline bool CompareA :: operator()(const A* a,const A* b) const    { return *a<*b; }
    et ma map devient :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    multimap<A*,A*,CompareA> listA
    Merci � vous deux, je vais essayer de voir du c�t� de boost.

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. [C++] Multimap with ostream_iterator
    Par taron dans le forum SL & STL
    R�ponses: 2
    Dernier message: 16/01/2006, 13h24
  2. Question sur les multimaps
    Par Chii-san dans le forum SL & STL
    R�ponses: 4
    Dernier message: 08/11/2005, 09h08
  3. STL : utilisation d'une multimap
    Par romeo9423 dans le forum SL & STL
    R�ponses: 7
    Dernier message: 18/08/2005, 07h56
  4. multimap initialisation
    Par moldavi dans le forum C++
    R�ponses: 2
    Dernier message: 14/03/2005, 17h04
  5. mais que fait upper_range() dans un multimap?
    Par porcher dans le forum C++
    R�ponses: 7
    Dernier message: 18/02/2005, 22h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo