L'exemple courant pour les boucles for () basées sur la plage C ++ 11 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;
}
Dans ce cas, xyz
est un int
. Mais que se passe-t-il lorsque 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 traversé est quelque chose de simple, il semble que les boucles for () basées sur une plage nous donneront chaque élément, pas un itérateur. Ce qui est bien ... s'il s'agissait d'un itérateur, la première chose que nous aurions toujours à faire est de le déférencer de toute façon.
Mais je ne sais pas à quoi m'attendre quand il s'agit de choses comme les cartes et les multimaps.
(Je suis toujours sur g ++ 4.4, alors que les boucles basées sur la plage sont dans g ++ 4.6+, donc je n'ai pas encore eu l'occasion de l'essayer.)
la source
std::begin
et lesstd::end
fonctions ou fonctions membres sous le même nom.Réponses:
Chaque élément du conteneur est un
map<K, V>::value_type
, qui est untypedef
pourstd::pair<const K, V>
. Par conséquent, en C ++ 17 ou supérieur, vous pouvez écrireou comme
si vous ne prévoyez pas de modifier les valeurs.
En C ++ 11 et C ++ 14, vous pouvez utiliser des
for
boucles améliorées pour extraire chaque paire par elle-même, puis extraire manuellement les clés et les valeurs:Vous pouvez également envisager de marquer la
kv
variableconst
si vous souhaitez une vue en lecture seule des valeurs.la source
En C ++ 17, cela s'appelle des liaisons structurées , ce qui permet les opérations suivantes:
la source
const &
à la clé, mais une référence non const à la valeur? (parce que c'est ce que fait map :: value_type ...)k
estconst
si vous utilisezfor(auto&[k,v]:testing)
De cet article: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2049.pdf
for( type-specifier-seq simple-declarator : expression ) statement
est syntaxiquement équivalent à
Vous pouvez donc clairement voir que ce sera
abc
dans votre casstd::pair<key_type, value_type >
. Donc, pour l'impression, vous pouvez accéder à chaque élément parabc.first
etabc.second
la source
Si vous ne souhaitez voir que les clés / valeurs de votre carte et que vous utilisez boost, vous pouvez utiliser les adaptateurs boost avec les boucles basées sur la plage:
il y a un boost équivalent :: adapters :: key_values
http://www.boost.org/doc/libs/1_51_0/libs/range/doc/html/range/reference/adaptors/reference/map_values.html
la source
Si l'opérateur d'affectation de copie de foo et bar est bon marché (par exemple, int, char, pointer, etc.), vous pouvez effectuer les opérations suivantes:
la source