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 :

vector<map<string, string> >::iterator ?


Sujet :

C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 206
    Points : 79
    Points
    79
    Par défaut vector<map<string, string> >::iterator ?
    Bonjour à tous

    J'essaie d'itérer sur un container de type vector<map<string, string> >::iterator et je n'y arrive pas. Voila ce que j'essaie:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for(vector<map<string, string> >::iterator itx = vmx.begin(); itx != vmx.end(); ++itx)
    cout << itx->first << " " << itx->second << endl;
    Mais le compilateur me dit que first et second n'existent pas... Je souhaiterais accéder aux clés et valeur de chaque map, en parcourant le vector.

    Auriez-vous une idée ?

    Merci d'avance

  2. #2
    Membre régulier Avatar de subzero01
    Inscrit en
    Décembre 2007
    Messages
    281
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Décembre 2007
    Messages : 281
    Points : 121
    Points
    121
    Par défaut
    te faut pas simplement des () devant first et second ?!

  3. #3
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 031
    Points : 11 475
    Points
    11 475
    Billets dans le blog
    11
    Par défaut
    itx est une itérateur de vector, et pas de map, donc effectivement first et second n'existent pas. Pour accéder à la valeur pointée par l'itérateur, tu fais comme ceici : ( * itx).
    Là tu auras une map<string, string>. Il te faut donc créer une nouvelle boucle pour accéder à chaque couple de valeurs de chaque map :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    for (vector< map<string, string> >::iterator itx = vmx.begin() ; itx != vmx.end() ; ++itx)
    {
    	for (map<string, string>::iterator it = ( * itx).begin() ; it != ( * itx).end() ; ++it)
    	{
    		cout << it->first << " " << it->second << endl;
    	}
    }

  4. #4
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 617
    Points
    15 617
    Par défaut
    Bonjour Scheme

    itx n'est pas un iterateur sur une map mais sur un vecteur !
    Utilise des typedef pour rendre le code plus lisible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    typedef std::map<string, string> Map;
    typedef Map::iterator MapIterator;
    typedef std::vector<Map> Vector;
    typedef Vector::iterator VectorIterator;
     
    Vector vmx;
    for(VectorIterator itx = vmx.begin(); itx != vmx.end(); ++itx)
    {
        Map& une_map = *itx;
        MapIterator it_map = une_map.begin(); 
        cout << it_map->first << " " << it_map->second << endl;
    }
    EDIT : pris de court par dragonjoker59

  5. #5
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 031
    Points : 11 475
    Points
    11 475
    Billets dans le blog
    11
    Par défaut
    Utilise des typedef pour rendre le code plus lisible
    Je suis d'accord, parce que tout de même, "vector< map<string, string> >::iterator" c'est moche...

  6. #6
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par dragonjoker59 Voir le message
    Je suis d'accord, parce que tout de même, "vector< map<string, string> >::iterator" c'est moche...
    Peut-être parce que vector<map<string,string> > c'est déjà moche à la base

    N'y-a-t-il pas une autre manière de faire ? Parce que la copie (en cas de copie) est quand même extrêmement lourde...

    Et au niveau architecture, j'ai du mal à voir l'intérêt d'une telle collection étrange...

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 206
    Points : 79
    Points
    79
    Par défaut
    Merci à vous deux

    En fait j'utilise un parser de xml qui renvoie cette fameuse collection que je trouve aussi très lourde. Je n'ai pas le choix :s

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 206
    Points : 79
    Points
    79
    Par défaut
    Ce n'est pas évident du tout d'utiliser cette collection...

    Je n'arrive pas à accéder à un élement donné d'une map par exemple.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for(vector<map<string, string> >::iterator itx = vmx.begin(); itx != vmx.end(); ++itx) {
    	cout << itx->find("name") << endl;
    }
    Ce code ne fonctionne pas, je suis obligé d'utiliser un iterator sur la map en plus de celui du vector pour arriver à faire ce que je veux ?

  9. #9
    Membre éprouvé Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Points : 997
    Points
    997
    Par défaut
    Bonjour,
    La fonction membre « find() » de std::map retourne un itérateur sur l'élément lorsqu'il est présent, et « end() » sinon.

  10. #10
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 617
    Points
    15 617
    Par défaut
    Peut-être parce que vector<map<string,string> > c'est déjà moche à la base

    N'y-a-t-il pas une autre manière de faire ? Parce que la copie (en cas de copie) est quand même extrêmement lourde...

    Et au niveau architecture, j'ai du mal à voir l'intérêt d'une telle collection étrange...
    Malheureusement, pas assez de monde lit ton blog...
    Plus sérieusement, l'architecture est souvent mise de côté dans certain projet (parfois même des gros ) et j'ai déjà rencontré ce type de structure (en fait, plus souvent de vector<vector<>>). A mon avis, les gens partent du principe "tant que ça marche, pourquoi s'embêter avec l'architecture". Après, quand le projet grandit ou qu'on veut l'utiliser sur un gros volume de données, on a des surprises (et paf, hécatombe de performances !)
    Il faut même parfois réécrire ce genre de code

  11. #11
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par scheme Voir le message
    Ce n'est pas évident du tout d'utiliser cette collection...
    N'est-ce pas

    Citation Envoyé par scheme Voir le message
    Je n'arrive pas à accéder à un élement donné d'une map par exemple.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for(vector<map<string, string> >::iterator itx = vmx.begin(); itx != vmx.end(); ++itx) {
    	cout << itx->find("name") << endl;
    }
    Ce code ne fonctionne pas, je suis obligé d'utiliser un iterator sur la map en plus de celui du vector pour arriver à faire ce que je veux ?
    Voui. Par ailleurs, et comme les autres avant moi, je te conseille de créer des alias de type, histoire de mieux t'en sortir.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    typedef map<string,string> attrib_map; // je suppose...
    typedef vector<attrib_map> element_list; // je suppose, de nouveau...
    typedef attrib_map::iterator attrib_iterator;
    typedef element_list::iterator element_iterator;
    typedef element_list::value_type attrib_type;
    (je pense que j'ai tort sur mes suppositions; mais je continue dans cette optique).

    Du coup,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    for(element_iterator itx = vmx.begin(); itx != vmx.end(); ++itx) {
    	// on sait qu'on manipule des élements, qui sont des collection
    	// d'attributs. On va réucpérer une référence sur l'élément
    	// manipulé, parce que ça va clarifier le code. 
    	attrib_type& a = *itx;
    	// du coup, on sait qu'on va récupérer un itérateur de map<U,T>
    	attrib_iterator atx = a.find("name");
    	// *atx est un pair<>, donc il faut récupérer ->second:
    	cout << atx->second << endl;
    }
    N'oublie pas que tu programmes pour toi et tes collègues, par pour que la machine comprenne. La machine n'a pas besoin de comprendre le code (et elle s'en moque, de toute façon). Par contre, toi oui : autant écrire quelque chose de très lisible.

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

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Complètement d'accord avec la dernière remarque d'Emmanuel, la lisibilité, c'est super important.
    Pour le PO, il y a le mot clé auto en C++0x maintenant. Donc si ton compilo le supporte, ça allège quand même franchement l'écriture...

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

Discussions similaires

  1. System.getenv() et interface Map<String, String>
    Par Elisia dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 23/01/2014, 12h58
  2. Map<String, String> static et accents
    Par zaboug dans le forum Collection et Stream
    Réponses: 7
    Dernier message: 01/08/2011, 10h11
  3. Recuperation d'un map <string,string> au lieu d'un list
    Par sallemel dans le forum Hibernate
    Réponses: 2
    Dernier message: 25/02/2011, 00h56
  4. @CollectionOfElements Map<String, String>
    Par Hammer dans le forum Hibernate
    Réponses: 1
    Dernier message: 15/04/2010, 20h27
  5. Vector de structure contenant des string
    Par Nicolas Bauland dans le forum C++
    Réponses: 9
    Dernier message: 04/02/2010, 12h47

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