web-dev-qa-db-fra.com

Puis-je facilement parcourir les valeurs d'une carte en utilisant une boucle for basée sur une plage?

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() ;
}
27
Blacklight Shining

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". :)

18
Xeo
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

16
lovaya

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;
}
15
Daniel Langr