web-dev-qa-db-fra.com

Comment parcourir/itérer la carte STL?

Besoin de savoir comment parcourir une carte stl. Je ne veux pas utiliser sa clé. Je me fiche de la commande, mais simplement d’un moyen d’accéder à tous les éléments qu’elle contient. Y a-t-il un moyen de faire cela?

32
atoMerz

Oui, vous pouvez parcourir une bibliothèque standard map. Il s'agit de la méthode de base utilisée pour parcourir une map. Elle permet également de parcourir toute collection de la bibliothèque standard:

C++ 03/C++ 11:

#include <cstdlib>
#include <map>
#include <string>
using namespace std;

int main()
{
    typedef map<int,string> MyMap;
    MyMap my_map;
    // ... magic

    for( MyMap::const_iterator it = my_map.begin(); it != my_map.end(); ++it )
    {
      int key = it->first;
      string value = it->second;
    }
}

Si vous avez besoin de modifier les éléments: 

  • Utilisez iterator plutôt que const_iterator.
  • Au lieu de copier les valeurs de l'itérateur, obtenez une référence et modifiez les valeurs par celle-ci.

    pour (MyMap :: iterator it = my_map.begin (); it! = my_map.end (); ++ it) { int key = it-> premier; chaîne & valeur = it-> second; if (valeur == "foo") valeur = "bar"; }

C’est ainsi que vous parcourez généralement les conteneurs de la bibliothèque standard à la main. La grande différence est que pour un map, le type de *it est un pair plutôt que l'élément lui-même.

C++ 11

Si vous avez l'avantage d'un compilateur C++ 11 (par exemple, le dernier GCC avec --std=c++11 ou MSVC), vous avez également d'autres options.

Tout d’abord, vous pouvez utiliser le mot clé auto pour vous débarrasser de toute cette vilaine verbosité:

#include <cstdlib>
#include <map>
#include <string>
using namespace std;

int main()
{
    map<int,string> my_map;
    // ... magic

    for( auto it = my_map.begin(); it != my_map.end(); ++it )
    {
      int key = it->first;
      string& value = it->second;
    }
}

Deuxièmement, vous pouvez également employer des lambdas. En conjonction avec decltype, cela pourrait produire un code plus propre (bien qu'avec des compromis):

#include <cstdlib>
#include <map>
#include <string>
#include <algorithm>
using namespace std;

int main()
{
    map<int,string> my_map;
    // ... magic

    for_each(my_map.begin(), my_map.end(), [](decltype(*my_map.begin()) val)
    {
        string& value = val.second;
        int key = val.first;
    });
}

C++ 11 explique également le concept d'une boucle for de bases de distance, que vous pouvez reconnaître comme étant similaire à d'autres langages. Cependant, certains compilateurs ne le supportent pas encore complètement, notamment MSVC.

#include <cstdlib>
#include <map>
#include <string>
#include <algorithm>
using namespace std;

int main()
{
    map<int,string> my_map;
    // ... magic

    for(auto val : my_map )
    {
        string& value = val.second;
        int key = val.first;
    }
}
60
John Dibling

Comme avec tout conteneur STL, les méthodes begin() et end() renvoient des itérateurs que vous pouvez utiliser pour effectuer une itération sur la carte. Le déréférencement d'un itérateur de carte donne un std::pair<const Key, Value>.

11
fredoverflow

Vous pouvez parcourir Carte STL de la même manière que tout autre conteneur STL: en utilisant des itérateurs, par exemple.

for (std::map<key, value>::const_iterator
     i = myMap.begin(), end = myMap.end(); i != end; ++i)
{
    // *i is a key-value pair
}
5
vitaut

Utilisation de for avec auto pour C++ 11 et supérieur

map<int,int> map_variable; //you can use any data type for keys, as well as value

for(auto &x:map_variable)
{ 
    cout<<x.first ;// gives the key
    cout<<x.second; //gives the value
}

Le nouveau format de for utilisant auto a été introduit en C++ 11

Pour lui donner des fonctionnalités comme certains langages de niveau supérieur comme python

Là où il y avait déjà une implémentation de ce type d'itération

P.S. : la variable map conserve les valeurs triées. Ainsi, lors de l'itération, vous obtiendrez les clés dans un ordre trié.

0
Harsh Sharma

Vous pouvez parcourir la carte en utilisant auto iterator. 

Extrait de code:

#include<bits/stdc++.h>
using namespace std;

int main()
{
      ios::sync_with_stdio(false);
      map<string, int> mp;

      mp["a"]=500;
      mp["b"]=200;
      mp["d"]=300;
      mp["c"]=400;

      for(auto it=mp.begin(); it != mp.end(); it++)
      {
         cout<<it->first <<" : "<<it->second<<endl;
      }
      return 0;
}
0
rashedcs