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 :

gcc et les multiset::iterator


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2004
    Messages : 33
    Points : 26
    Points
    26
    Par défaut gcc et les multiset::iterator
    Bonjour à tous,

    JJ'utilise les structures suivantes pour stocker des itérateurs d'un muliset dans un autre multiset. C'est pas très joli mais bon...

    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
     
    struct EdgeLine
    {
    	list <CvPoint> ptList;
    	int            oriCount;
    	int            blockedOri;
    	int            visitedOri[4];
    	bool           isOver;
    	float		theta;
    	float		length;
    	CvPoint	midlePoint;
    	int		num;
    	ItMap		*myMap;
     
    public:
    	EdgeLine(void)
    	{
    		visitedOri[0] = 0;
    		visitedOri[1] = 0;
    		visitedOri[2] = 0;
    		visitedOri[3] = 0;
    	};
    };
     
    struct ItMap
    {
    	multiset <EdgeLine,ComparisonL>::iterator LIt;
    	multiset <EdgeLine,ComparisonT>::iterator TIt;
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    multiset <EdgeLine,ComparisonL> globalEdgesL;
    multiset <EdgeLine,ComparisonT> globalEdgesT;
     
    myItL= globalEdgesL.insert(segToMerge);
    myItT= globalEdgesT.insert(segToMerge);
     
    myItL->myMap = new ItMap();
    myItL->myMap->TIt =myItT;
     
    myItT->myMap = new ItMap();
    myItT->myMap->LIt =myItL;
    Ce code compile et fonctionne sous visual studio 9.0 (2008). Par contre en compilant avec gcc, le compilateur me sort l'erreur suivante:

    "Assignment of data-member EdgeLine::myMap in read-only structure"

    En cheerchant un peu j'ai trouvé quelques infos qui pourraient expliquer ce problème...mais je croyais que les itérateurs set/multiset n'étaient pas invalidés par l'insertion/effacement des objects su set/multiset...est-ce correct?

    The iterators for set and multiset were changed from the standard iterator/const iterator pair to just being const iterators. The reason for this change was that they are ordered containers, and changing the element inside of an iterator can actually invalidate this ordering constraint.
    toute la discussion : http://stackoverflow.com/questions/2...or-in-multiset


    Enfin voilà, du coup, y-a-til un moyen de contourner/résoudre ce problème?

    Merci d'avance

    Frantz

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Le fait est, surtout, que les itérateurs sur les set / multiset sont d'office considérés comme... des itérateurs constants (fort proches de const_itérator)...

    La raison est simple: la valeur fait office de clé dans un (multi)set, et donc, toute modification de la valeur court le risque de... modifier la clé, et donc le classement

    Or, le plus sur moyen pour que ton (multi)set reste correctement trié est... d'empêcher la modification de la clé, et par conséquent (vu que c'est la même donnée) de la valeur

    C'est exactement la même chose que si tu essayais de modifier la clé (qui sert au tri) d'une (multi)map: elle risque de se retrouver "au mauvais endroit"

    Pour contourner le problème, tu peux déclarer myMap comme étant mutable, mais il faudra alors faire attention au fait qu'il ne doit en aucun cas intervenir dans les opérations de tri.

    Si myMap intervient dans les opérations de tri, la solution consiste à :
    1. récupérer ton objet en dehors du (multi)set
    2. supprimer l'élément correspondant du (multi)set
    3. modifier ton objet
    4. rajouter l'objet modifié
    En étant conscient du fait que cela risque de provoquer pas mal de copies (vu que tu travaille avec un multiset d'objets)
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre éclairé

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Points : 858
    Points
    858
    Par défaut
    Ou alors sépare les données qui servent au tri (la clé, constante) des autres données (la valeur, non-constante) et utilise une multimap.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2004
    Messages : 33
    Points : 26
    Points
    26
    Par défaut
    Merci beaucoup, déclarer myMap comme mutable a résolu le souci!!

    Résolu

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

Discussions similaires

  1. XCode et GCC, supprimer les versions inutiles
    Par ToTo13 dans le forum XCode
    Réponses: 1
    Dernier message: 30/03/2014, 07h35
  2. GCC et les entiers :]
    Par Array dans le forum Débuter
    Réponses: 12
    Dernier message: 08/04/2008, 16h26
  3. gcc et les commentaires
    Par daweed dans le forum Autres éditeurs
    Réponses: 3
    Dernier message: 26/10/2006, 20h58
  4. gcc et les normes
    Par gnto dans le forum C
    Réponses: 2
    Dernier message: 13/06/2006, 00h18
  5. Gcc et les fonctions
    Par fregolo52 dans le forum Linux
    Réponses: 9
    Dernier message: 09/08/2004, 18h55

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