我可以使用基于范围的for循环轻松迭代地图的值吗?

时间:2012-10-26 12:36:55

标签: c++ map for-loop c++11

是否可以仅使用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() ;
}

4 个答案:

答案 0 :(得分:18)

神奇在于Boost.Range's map_values adaptor

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

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

它被官方称为“基于范围的循环”,而不是“foreach循环”。 :)

答案 1 :(得分:15)

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

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

在c ++ 11(也称为c ++ 0x)中,你可以像在C#和Java中那样做

答案 2 :(得分:12)

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;
}

答案 3 :(得分:2)

C++20起,您可以将范围适配器std::views::valuesRanges library添加到您的range-based for loop。这样,您可以实现与Xeo's answer中的解决方案类似的解决方案,但无需使用Boost:

#include <map>
#include <ranges>

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

for (auto const &i : foo | std::views::values)
    i->bar();

Code on Wandbox