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 :

parcourir une liste


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 8
    Par défaut parcourir une liste
    Bonjours tout le monde, j'ai une petite question sur les listes

    en fait je voudrais pouvoir parcourir une liste j'ai essayer ceci :

    listConflict est une liste de classe Conflict et j'aimerai renvoyer un élément de la liste en fonction de sa position
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Conflict ConflictList::getConflict(int o) 
      {
        list<Conflict>::iterator iter;  
        iter = listConflict.begin();
        for (int i=0; i<o ; o++)
             {iter++;}
        return iter;
      }
    et voilà l'erreur que sa me sort:

    erreur: conversion from âstd::_List_iterator<Conflict>â to non-scalar type âConflictâ requested
    Si quelqu'un a une solution je suis preneur

    Merci d'avance

  2. #2
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Par défaut
    Telle qu'est definie ta fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Conflict ConflictList::getConflict(int o)
    Elle retourne une valeur de type "Conflict"

    Or tu essaies de retourner :

    Un itérateur !

    Donc, soit tu retourne un objet Conflict, soit tu retourne un itérateur !

    Soit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    list<Conflict>::iterator ConflictList::getConflict(int o) 
    {
        list<Conflict>::iterator iter;  
        iter = listConflict.begin();
        for (int i=0; i<o ; o++)
             {iter++;}
        return iter;
    }
    soit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Conflict ConflictList::getConflict(int o) 
    {
        list<Conflict>::iterator iter;  
        iter = listConflict.begin();
        for (int i=0; i<o ; o++)
             {iter++;}
        return (*iter);
    }
    Le (*iter) c'est pour déréferencer l'iterateur, qui est en fait un pointeur sur un element de la liste.

    J'espere ne pas avoir dit de betises

  3. #3
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    En général on peut toujours éviter d'aller chercher le n-ième élément d'une liste (c'est pas vraiment fait pour). D'où vient l'indice que tu passes à ta fonction ? D'une recherche ? D'un parcours ?

  4. #4
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    list<Conflict>::iterator ConflictList::getConflict(int o) 
      {
        list<Conflict>::iterator iter;  
        iter = listConflict.begin();
        for (int i=0; i<o ; o++)
             {iter++;}
        return iter;
      }
    EDIT : double Grilled !!!

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 8
    Par défaut
    En général on peut toujours éviter d'aller chercher le n-ième élément d'une liste (c'est pas vraiment fait pour). D'où vient l'indice que tu passes à ta fonction ? D'une recherche ? D'un parcours ?
    en fait cette fonction me sert pour:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void ConflictList::eraseConflict(Conflict c)
      {
      	for(int i= 0; i< getSize(); i++)
      		if(getConflict(i) == c)
      			listConflict.erase(c);
     
      }
    Puis elle me sert dans une autre fonction ou j'ai besoin de savoir si les conflicts de la liste contienne un certain élément et si oui je les suprimes sa donne sa:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    void conflictOut(ConflictList c, string s, list<string> Tmp)	
    {	
    	for (int iter=0; iter != c.getSize(); iter++)
    		if(c.getConflict(iter).containt(s))
    			{
    			 Tmp.push_back(c.getConflict(iter)); 
    			 c.eraseConflict(c.getConflict(iter)); 
    			}
    }
    Edit: l'erreur plus haut n'y est plus, il falait bien mettre *iter

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Citation Envoyé par Pyrmk
    en fait cette fonction me sert pour:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void ConflictList::eraseConflict(Conflict c)
      {
      	for(int i= 0; i< getSize(); i++)
      		if(getConflict(i) == c)
      			listConflict.erase(c);
     
      }
    Donc, tu parcours ta liste avec un indice, et pour retrouver l'itérateur correspondant tu vas la reparcourir ? Pourquoi ne pas la parcourir directement avec un itérateur ?
    De plus, il y a des précautions à prendre avec la suppression :
    http://c.developpez.com/faq/cpp/?pag...ssion_elements
    Mais ici tu pourrais tout simplement utiliser la fonction remove de std::list.

    Citation Envoyé par Pyrmk
    Puis elle me sert dans une autre fonction ou j'ai besoin de savoir si les conflicts de la liste contienne un certain élément et si oui je les suprimes sa donne sa:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    void conflictOut(ConflictList c, string s, list<string> Tmp)	
    {	
    	for (int iter=0; iter != c.getSize(); iter++)
    		if(c.getConflict(iter).containt(s))
    			{
    			 Tmp.push_back(c.getConflict(iter)); 
    			 c.eraseConflict(c.getConflict(iter)); 
    			}
    }
    Pareil, utilise un itérateur pour parcourir ta liste. Tu peux aussi utiliser remove_if si tu es motivé.

    De manière générale, il sera peut-être préférable de fournir une interface à base d'itérateurs plutôt que d'indices pour ta classe (vu que le conteneur sous-jacent est une liste, qui se mixe assez mal avec les indices).

    Sinon, si l'accès indicé est plus important que les performances, tu peux utiliser std::vector ou std::deque.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 8
    Par défaut
    Effectivement utiliser un iterateur direct est bien plus pratique donc voila ce qu'est devenu ma fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void ConflictList::eraseConflict(Conflict c)
      {
      	iter = listConflict.begin();
        	for (iter ; i!= listConflitc.end() ; i++)
      		if(*iter == c)
      			listConflict.erase(*iter);
      }
    Mais alors qu'il ne me restait plus qu'une erreur voilà ce qu'il me sort
    ConflictList.cc:2: erreur: expected nested-name-specifier before ânamespaceâ
    ConflictList.cc:2: erreur: expected unqualified-id before ânamespaceâ
    ConflictList.cc:2: erreur: expected `;' before ânamespaceâ
    et voilà mon début de fichier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #include "ConflictList.h"
    using namespace std;
    Donc l'erreur vient de la deuxième ligne mais je ne voi pas pourquoi Oo

    edit: si j'enlève la deuxième ligne il me reste sa
    ConflictList.cc:4: erreur: extra qualification âConflictList::â on member âConflictListâ
    ConflictList.cc:4: erreur: âConflictList::ConflictList()â cannot be overloaded
    ConflictList.h:14: erreur: with âConflictList::ConflictList()â
    ConflictList.cc:5: erreur: extra qualification âConflictList::â on member âConflictListâ
    ConflictList.cc:5: erreur: âConflictList::ConflictList(std::list<Conflict, std::allocator<Conflict> >)â cannot be overloaded
    extra qualification moi j'ai jamais vue avant

  8. #8
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Par défaut
    ConflictList.cc:2: erreur: expected `;' before namespace

    A vu de nez, je dirai qu'il manque un ; à la fin de ton fichier ConflictList.h

    De plus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void ConflictList::eraseConflict(Conflict c)
      {
            list<Conflict>::iterator iter; 
      	iter = listConflict.begin();
        	for (iter ; i!= listConflitc.end() ; i++)
      		if(*iter == c)
      			listConflict.erase(*iter);
      }
    Et ça devrait mieux le faire

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

Discussions similaires

  1. Parcourir une liste de fichiers
    Par viny dans le forum Langage
    Réponses: 3
    Dernier message: 10/01/2007, 17h21
  2. Parcourir une liste de checkbox
    Par fet dans le forum ASP
    Réponses: 3
    Dernier message: 25/07/2006, 12h35
  3. Parcourir une liste deroulante
    Par brandon dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 17/02/2005, 19h03
  4. parcourir une liste de la fin vers le début
    Par zdra dans le forum SL & STL
    Réponses: 12
    Dernier message: 06/02/2005, 18h40
  5. [langage] Parcourir une list de array
    Par nledez dans le forum Langage
    Réponses: 4
    Dernier message: 08/11/2004, 17h11

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