Est-il possible d'itérer sur toutes les valeurs dans un std :: map en utilisant juste un foreach?
Voici mon code actuel:
std::map<float, MyClass*> foo ;
for (map<float, MyClass*>::iterator i = foo.begin() ; i != foo.end() ; i ++ ) {
MyClass *j = i->second ;
j->bar() ;
}
Existe-t-il un moyen de le faire?
for (MyClass* i : /*magic here?*/) {
i->bar() ;
}
La magie réside avec Boost.Range's map_values
adaptateur :
#include <boost/range/adaptor/map.hpp>
for(auto&& i : foo | boost::adaptors::map_values){
i->bar();
}
Et cela s'appelle officiellement une "boucle basée sur la plage", pas une "boucle foreach". :)
std::map<float, MyClass*> foo;
for (const auto& any : foo) {
MyClass *j = any.second;
j->bar();
}
en c ++ 11 (également appelé c ++ 0x), vous pouvez le faire comme en C # et Java
Depuis C++ 1z/17, vous pouvez utiliser liaisons structurées:
#include <iostream>
#include <map>
#include <string>
int main() {
std::map<int, std::string> m;
m[1] = "first";
m[2] = "second";
m[3] = "third";
for (const auto & [key, value] : m)
std::cout << value << std::endl;
}