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 :

T& à partir d'un std::set<T>::iterator


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé

    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2004
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 61
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2004
    Messages : 58
    Par défaut T& à partir d'un std::set<T>::iterator
    Bonjour à tous,
    J'ai le sentiment que ma question est sans doute idiote, mais impossible de trouver la solution !
    Alors, je me permet de me tourner ves vous...

    J'ai des objets de type T dont je veux faire une liste ordonnée.
    J'ai donc défini une relation d'ordre qui porte sur le champ ref_ de T.

    Voici une partie de ma classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class DesT {
      public :
    ...
        void Ajoute (const T & c);
    ...
      private :
        typedef std::set<T, OrdreT> TypeListe;
        typedef TypeListe::const_iterator It;
        typedef TypeListe::iterator Wit;
        TypeListe liste_;
    };
    Le problème se pose à l'écriture de la méthode DesT::Ajoute.
    Je veux trouver s'il y a dans ma liste un objet ayant la même ref_ que l'objet à insérer, et si c'est le cas, je veux surcharger cet objet.
    Voilà ce que j'ai écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void DesT::Ajoute (const T & c) {
      std::pair<DesT::Wit, bool> p = liste_.insert (c);
      if (p.second == false) { // déjà un obj ayant cette ref_
        DesT::Wit it = p.first;
        T & cref = *it; // <<== Erreur de compilation
        cref += c;
        }
      }
    J'ai l'erreur suivante à la ligne marquée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     In member function `void DesT::Ajoute(const T&)':
    error: could not convert 
      `(&it)->std::_Rb_tree_iterator<_Val, _Ref, _Ptr>::operator*() const 
      [with _Val = T, _Ref = const T&, _Ptr = const T*]()' 
    to `T&'
    D'habitude, j'utilise toujours les containeurs de la STL avec des pointeurs,
    et je n'ai donc jamais vu ce problème... L'accès (*it) ne rend pas une référence sur un objet ?

    Merci de m'expliquer ce qu'il se passe...
    Est-ce interdit de modifier en place un élément d'un std::set ?

  2. #2
    Membre confirmé
    Inscrit en
    Janvier 2005
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 36
    Par défaut
    http://www.sgi.com/tech/stl/SimpleAs...Container.html

    The type of iterator used to iterate through a Simple Associative Container's elements. The types X::iterator and X::const_iterator must be the same type. That is, a Simple Associative Container does not provide mutable iterators. [1]

    donc a la question :
    Est-ce interdit de modifier en place un élément d'un std::set ?
    la reponse est oui

  3. #3
    Membre confirmé
    Inscrit en
    Janvier 2005
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 36
    Par défaut
    Je rajouterai que c'est logique car tu utilise un container trie, tu ne peux donc pas modifier un element au risque de casser le tri.

    la solution, retirer l'element, le modifier, le remettre. ca reste rapide.
    Une autre solution : l'utilisation de mutable mais a toi de savoir ce que tu fait et de ne pas modifier quoi que ce soit rentrant en compte dans les comparaison de tes objets

  4. #4
    Membre éprouvé

    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2004
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 61
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2004
    Messages : 58
    Par défaut
    Merci pour ta réponse rapide : ça confirme mes doutes...

    Citation Envoyé par dok3
    Je rajouterai que c'est logique car tu utilise un container trie, tu ne peux donc pas modifier un element au risque de casser le tri.
    Pour une fois que le language se préoccupe des bétises qu'on pourrait faire, on ne va pas se plaindre ;-)
    Citation Envoyé par dok3
    la solution, retirer l'element, le modifier, le remettre. ca reste rapide.
    Oui, c'est la conclusion à laquelle j'étais arrivée...
    Citation Envoyé par dok3
    Une autre solution : l'utilisation de mutable mais a toi de savoir ce que tu fait et de ne pas modifier quoi que ce soit rentrant en compte dans les comparaison de tes objets
    ah ! bonne idée ça il faut que j'étudie la chose dans mon cas précis...

    Merci bien.

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

Discussions similaires

  1. Défénir un std::map à partir d'un std::pair
    Par mat087 dans le forum SL & STL
    Réponses: 3
    Dernier message: 30/12/2006, 19h36
  2. Iterator et std::set
    Par Rodrigue dans le forum SL & STL
    Réponses: 1
    Dernier message: 26/09/2006, 16h06
  3. find() de std::set avec fonction de comparaison
    Par Biglo dans le forum SL & STL
    Réponses: 3
    Dernier message: 13/01/2006, 08h50
  4. Recherche "étoilée" avec std::set
    Par guejo dans le forum MFC
    Réponses: 2
    Dernier message: 06/05/2004, 13h28
  5. STL : std::set problème avec insert ...
    Par Big K. dans le forum MFC
    Réponses: 13
    Dernier message: 08/11/2003, 01h02

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