[c++] ¿Cómo usar el bucle for () basado en rangos con std :: map?


Answers

En C ++ 17, esto se denomina enlaces estructurados , que permite lo siguiente:

std::map< foo, bar > testing = { /*...blah...*/ };
for ( const auto& [ k, v ] : testing )
{
  std::cout << k << "=" << v << "\n";
}
Question

El ejemplo común para C ++ 11 basado en el rango para () loops es siempre algo simple como esto:

std::vector<int> numbers = { 1, 2, 3, 4, 5, 6, 7 };
for ( auto xyz : numbers )
{
     std::cout << xyz << std::endl;
}

En cuyo caso xyz es un int . Pero, ¿qué sucede cuando tenemos algo así como un mapa? ¿Cuál es el tipo de la variable en este ejemplo?

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?
}

Cuando el contenedor que se atraviesa es algo simple, parece que los bucles () basados ​​en rangos nos darán cada elemento, no un iterador. Lo cual es bueno ... si fuera un iterador, lo primero que siempre tendríamos que hacer es eliminarlo de todos modos.

Pero estoy confundido en cuanto a qué esperar cuando se trata de cosas como mapas y multimaps.

(Todavía estoy en g ++ 4.4, mientras que los bucles basados ​​en rango están en g ++ 4.6+, así que no he tenido la oportunidad de probarlo todavía).







Related