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 :

[std::list] Listes entrecroisées


Sujet :

SL & STL C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 14
    Par défaut [std::list] Listes entrecroisées
    Salut à tous !

    Je suis en train de me débatre avec les lists, et à vrai dire elles gagnent pour l'instant !

    Voici mon problème : J'ai une liste d'"invididus" (stockée dans une classe "espece"). Je crée un nouvel individu de la manière suivante :

    newIndiv = new Individual(...);

    puis je le rajoute à ma std::list <Individual> _pop;

    _pop.push_back(*newIndiv);

    Dans une autre classe, je désire trier mes individus existants différemments. Non pas par espece, mais par position dans l'espace. J'essaye donc de créer une autre liste d'Individus me basant sur ceux existants déjà. Un individu se retrouvera donc dans deux listes.

    Est-ce possible ? Que va t'il se passer lors de la destruction d'un element d'une des liste ? Va t'il detruire l'individu (celui-ci ne pouvant plus être accessible de par l'autre liste) ou juste sa position dans la liste courante ?

    Est-ce clair ?

    Merci d'avance !

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    newIndiv = new Individual(...);

    puis je le rajoute à ma std::list <Individual> _pop;

    _pop.push_back(*newIndiv);
    ça s'appelle une fuite mémoire, non ?

    un individu se retrouvera donc dans deux listes.

    Est-ce possible ?
    Bien sûr, mais dans ce cas là ce n'est plus une liste d'individus, mais une liste de pointeurs vers des individus.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 14
    Par défaut
    ça s'appelle une fuite mémoire, non ?
    pourquoi donc ?

    Bien sûr, mais dans ce cas là ce n'est plus une liste d'individus, mais une liste de pointeurs vers des individus.
    J'y ai pensé. Donc je crée ma deuxième liste de la manière suivante ?

    std::list <Individual*> _deuxiemeList;

    Je testerai ça demain

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    En fait, ce serait probablement mieux de faire
    std::list<boost::shared_ptr<Individual> >

    Pour ce qui est de la fuite mémoire, tu alloues l'objet avec new et tu le recopies en le mettant dans la liste. Ça n'a absolument aucun intérêt.
    Créé plutôt l'objet sur la pile...

  5. #5
    Membre habitué
    Inscrit en
    Mai 2007
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 11
    Par défaut
    moi j'ai eu un problème du même genre je pense
    j'avais une liste d'objet, et un element de cet objet devait pointer vers un objet d'une autre liste et il a jamais voulu compiler. N'ayant pas trouvé de solution à mon problème j'ai fait autrement (j'ai remplacé cet element par une chaine de caractère, et apres je faisait un rechercher dans la deuxieme liste quand j'avai besoin de certaines infos). mais ca allourdit beaucoup l'écriture.

    C'est dans ces cas la qu'il faut faire des pointeurs de pointeurs?? parce que j'ai jamais compris a quoi servait un pointeur de pointeur et comment ca se manipule...

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 14
    Par défaut
    d'accord, donc j'avais bel et bien mal compris comment fonctionait une liste.

    Je pensais qu'elle symbolisait uniquement les liens entre les différents objets. Mais elle CONTIENT les objets. Je pensais qu'une cellule de la liste avait en mémoire les différents pointeurs utile (vers la précédente, la suivante) et un pointeur vers l'objet. Et si j'ai bien compris le truc, elle contient l'objet en mémoire et non un pointeur vers celui-ci.

    Donc si on veut manipuler un objet à travers plusieurs listes, faut passer par des listes de pointeurs (std::list<boost::shared_ptr<Individual> >)

    Je me plonge dedans...

    Merci pour l'info Loufoque. Dis moi si j'ai bien tout compris, histoire que je passe le topic en résolu.

    @guideram : ben apparement on avait le même problème. En fait t'aurai pu résoudre ça en faisant des listes de pointeurs comme moi je pense. Mais il n'est pas questions de pointeurs de pointeurs, si je me trompe pas

  7. #7
    Membre éclairé Avatar de fdubks
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2007
    Messages : 73
    Par défaut
    Bonjour,

    Je me permet une petite remarque, il semble qu'il soit possible de creer deux listes pointant sur le meme objet.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    std::list<Individual*> l1;
    std::list<Individual*> l2;
     
    for (int i=0; i<10; i++)
    {
    	Individual* J = new Individual(i);
    	l1.push_back(J);
    	l2.push_front(J);
    }
     
    iterator=l1.begin();
    ((Individual*)(*iterator))->setNewVal(10);
    A ce moment, tu as bien changé de valeur dans les deux listes (du moins il me semble).

    J'espere que cela pourra t'aider.
    Je me permet cependant de remarquer que c'est assez loourd, et que sans utiliser les list, il y a surement plus simple et moins couteux.

  8. #8
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Je pensais qu'elle symbolisait uniquement les liens entre les différents objets. Mais elle CONTIENT les objets.
    std::list n'est pas un utilitaire pour t'aider à construire des listes chaînées.
    Pour ça, tu as les conteneurs intrusifs de boost. (qu'il n'est pas recommandé d'utiliser dans du code haut niveau)

    C'est simplement un conteneur (donc qui contient, logique), qui se trouve être implémenté comme une liste chaînée. Mais c'est un détail d'implémentation, dont tu es abstrait.

    Citation Envoyé par fdubks
    Je me permet une petite remarque, il semble qu'il soit possible de creer deux listes pointant sur le meme objet.
    Ou plus exactement deux listes de pointeurs, pointeurs qui peuvent bien sûr pointer sur le même objet.
    Comme cela a été dit deux messages plus haut, en fait.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    std::list<Individual*> l1;
    std::list<Individual*> l2;
     
    for (int i=0; i<10; i++)
    {
    	Individual* J = new Individual(i);
    	l1.push_back(J);
    	l2.push_front(J);
    }
    Code non exception-safe avec des fuites mémoire.
    La solution simple évidente étant shared_ptr.

    iterator n'a pas été déclaré.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ((Individual*)(*iterator))->setNewVal(10);
    cast inutile, dangereux, et qui allourdit le code inutilement.

    A ce moment, tu as bien changé de valeur dans les deux listes (du moins il me semble).
    Aucune valeur dans aucune liste n'a été changée.
    Ce qui a été changée, c'est la valeur de l'objet pointé.

    Je me permet cependant de remarquer que c'est assez loourd, et que sans utiliser les list, il y a surement plus simple et moins couteux.
    Je ne vois pas en quoi c'est particulièrement lourd et coûteux.

Discussions similaires

  1. Luabind et std::vector/list
    Par lludol dans le forum C++
    Réponses: 2
    Dernier message: 08/05/2014, 21h37
  2. Manipuler des listes de listes (List<List<String>>)
    Par qtnegg dans le forum Débuter avec Java
    Réponses: 16
    Dernier message: 16/02/2012, 15h33
  3. Réponses: 4
    Dernier message: 06/11/2007, 21h05
  4. [JFreeChart]Problème avec une List<List<Object>>
    Par maxlegrand dans le forum 2D
    Réponses: 1
    Dernier message: 15/06/2007, 22h45
  5. [Liste] Liste imposant la selection de 0, 1 ou 2 éléments
    Par KooKoolen dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 22/07/2006, 14h02

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