Comment utiliser la gamme à base de boucle for() avec std::map?
L'exemple le plus connu de C++11 gamme à base de() les boucles est toujours quelque chose de simple comme ceci:
std::vector<int> numbers = { 1, 2, 3, 4, 5, 6, 7 };
for ( auto xyz : numbers )
{
std::cout << xyz << std::endl;
}
Auquel cas xyz
est un int
. Mais, ce qui arrive quand nous avons quelque chose comme une carte? Quel est le type de la variable dans cet exemple:
std::map< foo, bar > testing = { /*...blah...*/ };
for ( auto abc : testing )
{
std::cout << abc << std::endl; //? should this give a foo? a bar?
std::cout << abc->first << std::endl; //? or is abc an iterator?
}
Lorsque le conteneur étant traversée est quelque chose de simple, ça ressemble à de la gamme, en fonction de() boucle de nous donner chaque élément, et pas un itérateur. Ce qui est beau...si c'était itérateur, la première chose que nous avons toujours avez à faire est de déréférencement d'elle de toute façon.
Mais je suis confus quant à ce à quoi s'attendre quand il s'agit de choses comme des cartes et des multimaps.
(Je suis toujours sur g++ 4.4, tandis que la gamme de base, les boucles sont en g++ 4.6+, je n'ai pas eu la chance de l'essayer encore.)
- La gamme de déclaration n'est impie de la danse avec la bibliothèque standard
std::begin
etstd::end
fonctions ou des fonctions de membre sous le même nom. - Sur un 3-exemple de ligne, vous vous êtes pris sur le faux nom de variable?
Vous devez vous connecter pour publier un commentaire.
Chaque élément du conteneur est un
map<K, V>::value_type
, qui est untypedef
pourstd::pair<const K, V>
. Par conséquent, vous devez écrire ce quePour l'efficacité, c'est une bonne idée de faire le paramètre de la boucle de référence. Vous pourriez aussi envisager de faire il
const
si vous voulez une vue en lecture seule des valeurs.À partir de C++17, vous pouvez également écrire
qui est beaucoup plus propre.
auto& kv : myMap
serait mieux, pour éviter d'inutiles copies de chaque valeur dans lemap<>
.auto const & kv
aurait été mieux. +1 de toute façon.En C++17 ceci est appelé structuré liaisons, qui permet la suivante:
const &
à la clé, mais un non-const de référence de la valeur? (parce que c'est ce map::value_type n'...)const
si vous utilisezfor(auto&[k,v]:testing)
À partir de ce document: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2049.pdf
for( type-specifier-seq simple-declarator : expression ) statement
est syntaxiquement équivalent à
De sorte que vous pouvez clairement voir que ce qui est
abc
dans votre cas serastd::pair<key_type, value_type >
.Donc, pour l'impression, vous pouvez le faire accéder à chaque élément par
abc.first
etabc.second
Si vous souhaitez voir uniquement les clés/valeurs de votre carte et, comme l'utilisation de boost, vous pouvez utiliser le boost adaptateurs de la gamme à base de boucles:
il y a un équivalent boost::adaptateurs::key_values
http://www.boost.org/doc/libs/1_51_0/libs/range/doc/html/range/reference/adaptors/reference/map_values.html
Si l'opérateur d'assignation de copie de foo et bar est bon marché (par exemple. int, char, etc pointeur), vous pouvez effectuer les opérations suivantes: