Si necesita iterar sobre un mapa, la forma más fácil es usar tuplas, desde conseguir la correcta escriba para typedef, es problemático. Aquí es cómo se puede utilizar tuplas:
std::map<int, double> my_map;
int key;
double value;
BOOST_FOREACH(boost::tie(key, value), my_map) { ... }
Sólo una nota, las comas va a trabajar aquí porque paréntesis se coloca alrededor de clave y valor. El preprocesador solo comprende comas y paréntesis (y c99 también requiere que comprenda las comillas). Por lo tanto, no puede analizar el <>
en std::pair<int, double>
. Sin embargo, podemos usar paréntesis para ayudar al preprocesador. Por ejemplo, si tenemos aa función que devuelve un contenedor que se llama así:
BOOST_FOREACH(int i, foo<int, int>()) { ... } //This won't compile
Por lo tanto, podemos colocar paréntesis alrededor de una expresión y que ayudará a que el preprocesador:
BOOST_FOREACH(int i, (foo<int, int>())) { ... } //This will compile
Sin embargo, en el caso de un mapa, no podemos colocar paréntesis alrededor de la declaración (porque no es una expresión). Así que esto no funcionará:
BOOST_FOREACH((std::pair<int, double> p), my_map) { ... } //This won't work
Debido a que conseguirá transformado en algo como esto (std::pair<int, double> p) = *it
, y que, por supuesto, es incorrecto C++.Pero usar un lazo funcionará:
BOOST_FOREACH(tie(key, value), my_map) { ... } //This will work
Solo tenemos que declarar la clave y el valor fuera del ciclo (como se muestra arriba). Además, puede hacer que el ciclo tenga nombres más significativos. Puede escribir key
en lugar de p.first
y value
en lugar de p.second
.
probablemente debería hacer lo siguiente: std :: map :: value_type –
también en C++ 11; BOOST_FOREACH (auto & ref, my_map) {...} –