40

std::map是否可以仅使用“foreach”来迭代 a 中的所有值?

这是我当前的代码:

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

4 回答 4

42

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;
}
于 2017-11-12T14:51:29.587 回答
30
std::map<float, MyClass*> foo;

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

在 c++11(也称为 c++0x)中,您可以像在 C# 和 Java 中一样执行此操作

于 2012-10-26T12:48:45.823 回答
21

神奇之处在于Boost.Range 的map_values适配器

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

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

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

于 2012-10-26T12:39:12.137 回答
7

C++20开始,您可以将 Ranges 库中的范围适配器添加std::views::values基于范围的 for 循环中。这样,您可以实现与Xeo 的答案类似的解决方案,但不使用 Boost:

#include <map>
#include <ranges>

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

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

魔杖盒上的代码

于 2020-08-11T07:05:29.470 回答