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?
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:
#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:
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.
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;
}
}
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>
.
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
}
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é.
Vous pouvez parcourir la carte en utilisant auto iterator.
#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;
}