¿Reemplazar BOOST_FOREACH con una alternativa “pura” de C++ 11?
c++11 boost-foreach (2)
¿Es posible reemplazar el BOOST_FOREACH
en este ejemplo con un equivalente "puro" de C ++ 11?
#include <map>
#include <functional>
#include <boost/foreach.hpp>
#include <iostream>
int main() {
std::map<int, std::string> map = {std::make_pair(1,"one"), std::make_pair(2,"two")};
int k;
std::string v;
BOOST_FOREACH(std::tie(k, v), map) {
std::cout << "k=" << k << " - " << v << std::endl;
}
}
La característica clave es mantener el par clave / valor en las referencias a k
y v
.
Lo intenté:
for(std::tie(k,v) : map)
{
std::cout << "k=" << k << " - " << v << std::endl;
}
y
auto i = std::tie(k,v);
for(i : map)
{
std::cout << "k=" << k << " - " << v << std::endl;
}
Pero ninguna de las ideas basadas en rangos basados en bucles parecía funcionar. Presumiblemente, el rango para el bucle for está obligado a tener una declaración antes de :
dado que incluso:
std::vector<int> test;
int i;
for (i : test);
No es valido
El equivalente más cercano que puedo encontrar es:
for (auto it = map.begin(); it!=map.end() && (std::tie(k,v)=*it,1); ++it)
{
std::cout << "k=" << k << " - " << v << std::endl;
}
¡que no es tan sucinta como la versión BOOST_FOREACH
!
¿Hay una manera de expresar lo mismo de manera sucinta sin impulso en C ++ 11?
Esto produce la misma salida que la macro Boost.
for( auto const& k : map ) {
std::cout << "k = " << k.first << " - " << k.second << std::endl;
}
for (auto & i : map)
{
std::tie(k,v) = i;
// your code here
}