3 votes

Comment itérer à travers une carte dans un vecteur de cartes ?

Code écrit en C++

Environnement : Microsoft Visual Studio

J'ai un vecteur de cartes. D'abord, je veux itérer à travers la première carte, obtenir son "premier" et son "second" et les enregistrer dans une autre structure que j'ai construite (une carte de vecteurs). Ensuite, je vais itérer à travers les cartes de gauche dans mon "vecteur de cartes" et faire la même chose...

Voici mon vecteur de cartes :

typedef vector<map<string,unsigned int>> myvec;

Et voici la fonction qui devrait faire le travail :

void Coogle::make_index(const myvec& the_vec)
{
    //SCAN THE FIRST MAP
    map<string,unsigned int>::iterator map_iter;
    index::iterator idx_iter = the_index.begin();
    for(map_iter=the_vec[0].begin(); map_iter!=the_vec[0].end(); ++map_iter)
    {

    }
}

La boucle 'for' doit itérer sur la première carte du vecteur. J'ai déclaré un itérateur de carte parce que j'en ai besoin pour itérer dans la carte ! Pas vrai ? Pourquoi ça ne marche pas ?

l'erreur :

IntelliSense : aucun opérateur "=" ne correspond à ces opérandes

Merci beaucoup ! !!


OK, maintenant j'ai identifié cet itérateur :

index::iterator idx_iter = the_index.begin();

Et voici mon "index" :

typedef map<string,vector<unsigned int>> index;

Et dans la boucle 'for' mentionnée, j'ai fait ce qui suit :

    for(map_iter=the_vec[0].begin(); map_iter!=the_vec[0].end(); ++map_iter)
    {
        /*#1*/ idx_iter->first = map_iter->first;
        /*#2*/ idx_iter->second[0] = map_iter->second;
        /*#3*/ idx_iter++;
    }

Le numéro 2 semble être correct. Mais le n°1 génère une erreur :

IntelliSense : aucun opérateur "=" ne correspond à ces opérandes

C'est la même erreur que la précédente, donc je suppose que c'est un problème similaire. C'est le cas ?

éditer : Pour être plus clair, ce que je veux faire, c'est ajouter à partir de const myvec& the_vec à l'emplacement 'i' (dans ce cas '0') de mon index.

Encore une fois :

typedef vector<map<string,unsigned int>> myvec;
typedef map<string,vector<unsigned int>> index;

Merci !

7voto

Xion Points 11130

the_vec est passé comme référence à la constante, donc vous avez besoin de const_iterator :

map<string,unsigned int>::const_iterator map_iter;

0voto

Mike Seymour Points 130519

Pour répondre à votre deuxième question, vous ne pouvez pas modifier les clés d'une carte, car elles doivent être conservées dans l'ordre. Si vous voulez remplacer tous les éléments de l'index, il est probablement préférable de l'effacer d'abord, puis d'ajouter les nouveaux éléments :

the_index.clear();
for(map_iter=the_vec[0].begin(); map_iter!=the_vec[0].end(); ++map_iter)
{
    the_index[map_iter->first].push_back(map_iter->second);
}

0voto

jsetting32 Points 604

Voici une façon d'itérer à travers une map qui contient des clés de string et des valeurs de vector s de string s :

for( map<string, vector<string>>::iterator ii = timeZonesMap.begin(); ii != timeZonesMap.end(); ++ii)
{
    cout << ii->first << ": " << endl;
    for(std::vector<string>::iterator it = ii->second.begin(); it != ii->second.end(); ++it) {
        std::cout << *it << endl;
    }
}

J'espère que cela aidera quelqu'un à l'avenir.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X