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 :

list, ses itérateurs, les pointeurs sur objet et sa fonction sort


Sujet :

SL & STL C++

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 632
    Points : 30 711
    Points
    30 711
    Par défaut list, ses itérateurs, les pointeurs sur objet et sa fonction sort
    Salut,

    Je suis pris d'un doute subit en ce qui concerne la std::list...

    Je sais (ou du moins, je crois savoir) que l'insertion ne va pas invalider les pointeurs sur les objets qu'elle contient, et que la suppression ne va invalider que le pointeur sur l'objet supprimé.

    Ainsi, normalement, si je prévois un code proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    std::list<UnType> l;
    l.push_back(Untype);
    /*... */
    UnType * ptr*=&(*(l.begin());
    l.push_back(UnType);
    /* ptr reste valide
     *... */
    l.erase(l.rbegin());
    /* ptr est toujours valide, pour autant que la suppression n'ai pas
     * porté sur l'objet pointé
     */
    ptr devrait toujours être valide après la seconde insertion, ainsi qu'après l'effacement d'un objet tant que ce n'est pas l'objet pointé.

    Mais qu'en est il de la fonction membre sort

    Se contente-t-elle de refaire les différentes liaisons entre les itérateurs, sans invalider ptr (selon l'exemple) ou va-t-elle carrément créer des copies des différents objets, ce qui reviendra à ... invalider ptr.

    Sur mon système (Gcc 4.5.0), il semblerait que ptr ne soit pas invalidé, mais est-ce le comportement que l'on est réellement en droit d'attendre

    Et la question connexe: est-il ne serait-ce qu'intéressant d'envisager l'usage d'un shared_ptr quelconque pour représenter ptr

  2. #2
    screetch
    Invité(e)
    Par défaut
    http://www.sgi.com/tech/stl/List.html
    void sort(); Sorts *this according to operator<. The sort is stable, that is, the relative order of equivalent elements is preserved. All iterators remain valid and continue to point to the same elements. [6] The number of comparisons is approximately N log N, where N is the list's size.

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 632
    Points : 30 711
    Points
    30 711
    Par défaut
    C'est bien ce qu'il me semblait...

    Merci

    Il est parfois bizare de constater comme on peut douter de choses finalement simples

    Je laisse la discussion pour avoir la réponse à la question connexe (celle qui concerne l'utilisation d'un shared_ptr)

  4. #4
    screetch
    Invité(e)
    Par défaut
    hmm un shared_ptr ne fonctionne qu'avec un new
    dans ce cas il faudrait une std::list< shared<UnType> > n'est-ce pas ?
    car la c'est bien la liste qui est propriétaire des objets (en tous cas des copies des objets)

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 632
    Points : 30 711
    Points
    30 711
    Par défaut
    Oui, donc, effectivement, cela n'a strictement aucun intérêt, vu que le pointeur n'est en définitive là qu'en "soutien" afin de pouvoir accéder à un élément sélectionné de la liste...

    L'idée est en fait d'avoir une classe qui se présenterait sous la forme de
    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
    class MyHolder
    {
        public:
           void registerItem(std::string const &);
           void selectItem(std::string const &) const;
           UnType & selected()
           {
               if(!selected_)
                   throw unselected();
               return *selected_;
           }
           UnType const & selected()const
           {
               if(!selected_)
                   throw unselected();
               return *selected_;
           }
        private:
            std::list<UnType> list_;
            mutable UnType* selected_;
    };
    Du moment que je pense bien à faire pointer selected_ vers NULL quand le pointeur est invalidé, je n'ai effectivement aucun intérêt à me compliquer la vie avec les shared_ptr, quels qu'ils soient

  6. #6
    screetch
    Invité(e)
    Par défaut
    oui, apparemment comme c'est une garantie forte de la liste, tes éléments sont toujours stables, du coup la liste devrait en être la propriétaire, ca simplifie les choses.

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 632
    Points : 30 711
    Points
    30 711
    Par défaut
    Citation Envoyé par screetch Voir le message
    oui, apparemment comme c'est une garantie forte de la liste, tes éléments sont toujours stables, du coup la liste devrait en être la propriétaire, ca simplifie les choses.
    Surtout quand tu n'as pas forcément de contraintes en termes de performances pures, et que tu fait principalement des ajouts et quelques sélections

  8. #8
    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 : 50
    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
    Points : 16 213
    Points
    16 213
    Par défaut
    Par contre, dans la norme elle-même, ce n'est pas spécifié.
    A priori, je ne vois pas trop pourquoi quoi que ce soit serait invalidé, mais on ne sait jamais. Je vais poser la question.

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

Discussions similaires

  1. probleme avec les pointeurs sur des objet heterogene
    Par Fifou625 dans le forum Débuter
    Réponses: 4
    Dernier message: 09/12/2011, 22h27
  2. les pointeurs sur pointeurs ne m'aiment pas :/
    Par GhostNemo dans le forum C
    Réponses: 3
    Dernier message: 18/12/2006, 00h10
  3. Tableau de pointeurs sur objets
    Par bassim dans le forum C++
    Réponses: 11
    Dernier message: 13/12/2005, 20h45
  4. [TTreeView] Problème avec les pointeurs d'objet
    Par BlackWood dans le forum Composants VCL
    Réponses: 2
    Dernier message: 02/07/2004, 15h31
  5. [Debutant VC++.net] Obtenir un pointeur sur objet
    Par SteelBox dans le forum MFC
    Réponses: 6
    Dernier message: 17/06/2004, 19h36

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