O exemplo comum para loops for () baseados no intervalo do C ++ 11 é sempre algo simples como este:
std::vector<int> numbers = { 1, 2, 3, 4, 5, 6, 7 };
for ( auto xyz : numbers )
{
std::cout << xyz << std::endl;
}
Nesse caso, xyz
é um int
. Mas, o que acontece quando temos algo como um mapa? Qual é o tipo da variável neste exemplo:
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?
}
Quando o contêiner que está sendo atravessado é algo simples, parece que os loops baseados em intervalo para () nos fornecerão cada item, não um iterador. O que é legal ... se fosse o iterador, a primeira coisa que sempre precisaríamos fazer é desreferenciar isso de qualquer maneira.
Mas estou confuso sobre o que esperar quando se trata de mapas e mapas múltiplos.
(Ainda estou no g ++ 4.4, enquanto os loops baseados em intervalo estão no g ++ 4.6+, então ainda não tive a chance de experimentá-lo.)
c++
c++11
for-loop
dictionary
Stéphane
fonte
fonte
std::begin
estd::end
funções padrão ou funções-membro com o mesmo nome.Respostas:
Cada elemento do contêiner é um
map<K, V>::value_type
, que é umtypedef
parastd::pair<const K, V>
. Conseqüentemente, no C ++ 17 ou superior, você pode escreverou como
se você não planeja modificar os valores.
No C ++ 11 e C ++ 14, você pode usar
for
loops aprimorados para extrair cada par por conta própria e extrair manualmente as chaves e os valores:Você também pode marcar a
kv
variávelconst
se desejar uma visualização somente leitura dos valores.fonte
No C ++ 17, isso é chamado de ligações estruturadas , o que permite o seguinte:
fonte
const &
para a chave, mas uma referência não-constante ao valor? (porque isso é o mapa :: value_type faz ...)k
éconst
se você usarfor(auto&[k,v]:testing)
Deste artigo: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2049.pdf
for( type-specifier-seq simple-declarator : expression ) statement
é sintaticamente equivalente a
Assim, você pode ver claramente que será o
abc
seu casostd::pair<key_type, value_type >
. Portanto, para impressão, você pode acessar cada elemento porabc.first
eabc.second
fonte
Se você quiser ver apenas as chaves / valores do seu mapa e gostar de usar o boost, poderá usar os adaptadores de boost com os loops baseados em intervalo:
existe um impulso equivalente :: adapters :: key_values
http://www.boost.org/doc/libs/1_51_0/libs/range/doc/html/range/reference/adaptors/reference/map_values.html
fonte
Se o operador de atribuição de cópias de foo e bar for barato (por exemplo, int, char, ponteiro etc.), você pode fazer o seguinte:
fonte