是否可以仅使用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() ;
}
答案 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::values
从Ranges 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();