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

SL & STL C++ Discussion :

iterator en clef de map impossible ?


Sujet :

SL & STL C++

  1. #1
    Membre éprouvé Avatar de gnto
    Homme Profil pro
    Ingénieur système logiciel
    Inscrit en
    Janvier 2006
    Messages
    923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur système logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2006
    Messages : 923
    Points : 1 210
    Points
    1 210
    Par défaut iterator en clef de map impossible ?
    Bonjour,

    Je sais que ça parait un peu fou mais je transcrit un code C++/MFC en C++/STL et la je rencontre une difficulté de taille.

    Bref j'ai une liste et une map.
    les iterator de ma std::list<obj *>::iterator sont les clefs de ma map : std::map<std::list<obj *>::iterator,int>

    Les problèmes arrivent à l'ajout et à la suppression d'une pair.

    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
    #include "CObj.h"
     
    std::map<std::list<CObj *>::iterator,int> CObj::ObjetPositions;
    std::list<CObj *> CObj::Objets;
     
    CObj::CObj()
    {
        CObj::ObjetPositions[CObj::Objets.begin()] = 2;
     
    }
     
    CObj::~CObj()
    {
        CObj::ObjetPositions.erase(--CObj::Objets.end());
    }
    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
    #ifndef COBJ_H_
    #define COBJ_H_
     
    #include <list>
    #include <map>
     
    class CObj
    {
    public:
        CObj();
        virtual ~CObj();
        static std::map<std::list<CObj *>::iterator,int> ObjetPositions;
        static std::list<CObj *> Objets;
    };
     
    #endif /*COBJ_H_*/
    C:/MinGW/bin/../lib/gcc/mingw32/3.4.5/../../../../include/c++/3.4.5/bits/stl_function.h: In member function `bool std::less<_Tp>::operator()(const _Tp&, const _Tp&) const [with _Tp = std::_List_iterator<CObj*>]':
    C:/MinGW/bin/../lib/gcc/mingw32/3.4.5/../../../../include/c++/3.4.5/bits/stl_map.h:338: instantiated from `_Tp& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](const _Key&) [with _Key = std::_List_iterator<CObj*>, _Tp = int, _Compare = std::less<std::_List_iterator<CObj*> >, _Alloc = std::allocator<std::pair<const std::_List_iterator<CObj*>, int> >]'
    ..\src\CAlarmMsg.cpp:8: instantiated from here
    C:/MinGW/bin/../lib/gcc/mingw32/3.4.5/../../../../include/c++/3.4.5/bits/stl_function.h:227: error: no match for 'operator<' in '__x < __y'
    je cherche une solution TECHNIQUE.

    Merci d'avance

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    Si on lit bien, on comprend que le compilateur n'est pas content par ce qu'il ne trouve pas l'opérateur '<' pour l'itérateur...
    On peut l'ajouter (dans le header par exemple)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    bool operator < (std::list<CObj*>::iterator itL, std::list<CObj*>::iterator itR){
       return *itL < *itR;
    }
    De plus, mais ce n'est pas lié au problème, j'aurai tendance à vérifier que les suppressions dans la map sont cohérents :
    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
     
    CObj::CObj()
    {
       Objets.push_front(this);
       ObjetPositions[Objets.begin()] = 2;
    }
     
    CObj::~CObj()
    {
       std::list<CObj*>::iterator it;
       it = std::find(Objets.begin(), Objets.end(), this);
       if(Objets.end() != it){
          ObjetPositions.erase(it);
       }
    }

  3. #3
    Membre éprouvé Avatar de gnto
    Homme Profil pro
    Ingénieur système logiciel
    Inscrit en
    Janvier 2006
    Messages
    923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur système logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2006
    Messages : 923
    Points : 1 210
    Points
    1 210
    Par défaut
    Ok merci,

    je comprenais pourquoi il avait besoin de l'operateur < maintenant je vois mieux

    Pour la verif des suppressions je l'ai pas mis sur l'exemple minimaliste.

  4. #4
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par gnto Voir le message
    je comprenais pourquoi il avait besoin de l'operateur < maintenant je vois mieux
    Attention quand même à l'opérateur <. Il doit suivre des règles mathématiques assez strictes sous peine de créer pas mal de problème à l'exécution. (A moins transitivité et non-réflexivité)

    Citation Envoyé par gnto Voir le message
    Pour la verif des suppressions je l'ai pas mis sur l'exemple minimaliste.
    Dans le doute, je me suis dit que ça serai pas perdu. :-)

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Février 2003
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 224
    Points : 185
    Points
    185
    Par défaut
    J'ai dit des betises
    voir post du dessous.

    hum de memoire; et je peux me tromper, mais je ne crois pas que la STL valide le fait qu'un iterator pointe tjs sur le meme objet dans le temps.


    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    // TestMap.cpp : Defines the entry point for the console application.
    //
     
    #include "stdafx.h"
    #include <string>
    #include <map>
    #include <iostream>
     
    int _tmain(int argc, _TCHAR* argv[])
    {
        int j;
     
     
        std::map < std::string, int > imap;
        imap["1"] = 1;
     
        std::map < std::string, int >::iterator i = imap.find("1");
     
        std::cout << i->second << std::endl;
        std::cin >> j;
     
        imap["0"] = 0;
        imap["2"] = 2;
        imap["3"] = 3;
        imap["4"] = 4;
        imap["5"] = 5;
        imap.erase("0");
     
        std::cout << i->second << std::endl;
     
     
        std::cin >> j;
    	return 0;
    }
    Ca marche chez moi sous Visual 2005 mais je sais pas si c'est tjs valide.
    Sans compter que si tu fais
    forcement tout plante

    Et je prend que l'exemple du conteneur map, mais sur une liste... rien n'est moins sur.. à tester donc.

  6. #6
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par escafr Voir le message
    hum de memoire; et je peux me tromper, mais je ne crois pas que la STL valide le fait qu'un iterator pointe tjs sur le meme objet dans le temps.

    Et je prend que l'exemple du conteneur map, mais sur une liste... rien n'est moins sur.. à tester donc.
    Citation Envoyé par http://www.sgi.com/tech/stl/List.html
    Lists have the important property that insertion and splicing do not invalidate iterators to list elements, and that even removal invalidates only the iterators that point to the elements that are removed.
    En résumé pour ceux qui préfèrent Molière à Shakespeare, un itérateur sur une liste est toujours valide, sauf sur les élément qui ont été retirés.
    On peut donc tout à fait utiliser un itérateur de list pour indexer un map.

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Février 2003
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 224
    Points : 185
    Points
    185
    Par défaut


    je n'avais pas réussi a trouver cette info sur ccpreference.

    Merci bien donc

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Mapping] Mapping impossible avec Hibernate
    Par HDThoreau dans le forum Hibernate
    Réponses: 1
    Dernier message: 23/01/2013, 21h59
  2. [Google Map]Impossible d'afficher la carte
    Par Invité dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 25/09/2008, 11h46
  3. Clefs composees +mapping 3 tables
    Par willoi dans le forum Hibernate
    Réponses: 9
    Dernier message: 13/03/2007, 13h22
  4. la tag logic iterate avec une liste Map
    Par casawi dans le forum Struts 1
    Réponses: 9
    Dernier message: 07/03/2007, 20h27
  5. Réponses: 22
    Dernier message: 28/07/2005, 21h37

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