web-dev-qa-db-ja.com

範囲ベースのforループを使用して、マップの値を簡単に反復できますか?

Foreachだけを使用してstd :: mapのすべての値を反復処理することは可能ですか?

これは私の現在のコードです:

std::map<float, MyClass*> foo ;

for (map<float, MyClass*>::iterator i = foo.begin() ; i != foo.end() ; i ++ ) {
    MyClass *j = i->second ;
    j->bar() ;
}

これを行う方法はありますか?

for (MyClass* i : /*magic here?*/) {
    i->bar() ;
}
27

魔法は Boost.Range's map_valuesアダプター

#include <boost/range/adaptor/map.hpp>

for(auto&& i : foo | boost::adaptors::map_values){
  i->bar();
}

そして、正式には「範囲ベースのforループ」と呼ばれ、「foreachループ」ではありません。 :)

18
Xeo
std::map<float, MyClass*> foo;

for (const auto& any : foo) {
    MyClass *j = any.second;
    j->bar();
}

c ++ 11(c ++ 0xとも呼ばれます)では、C#やJavaのようにこれを行うことができます

16
lovaya

C++ 1z/17から、構造化バインディングを使用できます。

#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