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 :

Utilisation de pop_front sur une liste de pointeurs dans une classe


Sujet :

C++

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2011
    Messages : 7
    Points : 5
    Points
    5
    Par défaut Utilisation de pop_front sur une liste de pointeurs dans une classe
    Bonjour,

    J'essaie d'utiliser pop_front sur une liste de pointeur qui fait partie d'une classe. Évidemment, ca ne fonctionne pas car pop_front n'est pas une méthode membre.

    Voici mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class LeafNode : public Node // Inherits from Node class
    {
     private:
      vector<Leaf *> m_children;
    [...] /

    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
    void LeafNode::addLeaf( LeafNode * original, int kVar[], int kLeaf[], int *kLeafCount, int *leafCount, int *nrxL)
    {
        setNchilds(0);
        setNobs(0);
    
      while ( ((kLeaf[*kLeafCount]) <= (*leafCount) + original->getNchilds()) &  (*kLeafCount < *nrxL))
      {
        
           
        m_children.push_back ( new Leaf(original->m_children[kLeaf[(*kLeafCount) - (*leafCount) ]- 1], kVar  )); /*Copy leaf*/
    
        [...]
    
      }
    
      //Remove the empty first leaf
      popLeaf();
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void LeafNode::popLeaf()
    {
        //vector <Leaf *> LeafVector;
       // getLeaves(LeafVector);
        //*LeafVector.pop_front();
       // m_children = LeafVector;
     
        m_children.pop_front();
    }
    Dans popLeaf(), la section en commentaires est une des solutions proposées sur le Web mais elle ne fonctionne pas pour moi.

    Le message d'erreur est le suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error: 'class std::vector(Leaf*)' has no member named 'pop_front'
    Ce qui me laisse perplexe, c'est que m_children puisse utiliser push_back(...) mais pas pop_front().
    Je dois absolument trouver un moyen de retirer le premier élément de mon vecteur car il s'agit d'une feuille vide.
    Quelqu'un a une idée?

  2. #2
    Membre éclairé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 264
    Points : 725
    Points
    725
    Par défaut
    Bonjour,

    Effectivement, vector ne possède pas de méthode pop_front(), essentiellement pour des raisons de performance, car chaque appel entrainement une recopie complète du contenu du vector pour le décaler d'un indice. Il en résulterait des performances très mauvaises.

    Es-tu sûr d'avoir fait le bon choix de conteneur ? Selon tes besoins, tu devrais peut-être envisager d'utiliser une list ou une deque, qui possèdent toutes deux une méthode pop_front().

    Je me permets de te renvoyer à la FAQ C++ (si tu ne l'as pas déjà lue), qui contient un organigramme pour faciliter le choix d'un conteneur plutôt qu'un autre :

    http://cpp.developpez.com/faq/cpp/?p...hoix_conteneur
    "By and large I'm trying to minimize mentions of D in C++ contexts because it's as unfair as bringing a machine gun to a knife fight." - Andrei Alexandrescu

  3. #3
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Si m_children a toujours au - un élément, tu peux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::vector <Leaf *> LeafVector(m_children.begin()+1,m_children.end());
    std::swap(m_children,LeafVector);
    Cependant, comme Niark13, je me demande s'il s'agit du bon conteneur si tu souhaites faire des pop_front.
    Pour le nom push_back, il s'agit d'uniformiser les noms des différents conteneurs (vector, list, map, ...) pour garder une cohérence. Il existe push_back, push_front,pop_back, pop_front, etc.... Mais ces fonctions ne sont effectivement définies que dans les conteneurs où cela fait sens. Ce qui n'est pas le cas de pop_front pour std::vector

Discussions similaires

  1. [AC-2010] Utiliser valeur d'une liste de choix dans une liste déroulante d'un autre formulaire
    Par Sébastien1609 dans le forum Macros Access
    Réponses: 1
    Dernier message: 11/06/2015, 15h31
  2. Réponses: 9
    Dernier message: 21/05/2014, 20h21
  3. [LibreOffice][Base de données] Recuperer une liste de tables et une liste de champs d'une table sur LibreOffice & OpenOffice
    Par gerard.sauvage dans le forum OpenOffice & LibreOffice
    Réponses: 2
    Dernier message: 08/04/2014, 12h35
  4. Réponses: 1
    Dernier message: 26/12/2010, 21h20
  5. Réponses: 0
    Dernier message: 09/11/2010, 15h43

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