Ответ 1
Магия лежит на Boost.Range map_values
adapter:
#include <boost/range/adaptor/map.hpp>
for(auto&& i : foo | boost::adaptors::map_values){
i->bar();
}
И он официально называется "диапазон для цикла", а не "цикл foreach".:)
Можно ли перебирать все значения в std:: map, используя только foreach?
Это мой текущий код:
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() ;
}
Магия лежит на Boost.Range map_values
adapter:
#include <boost/range/adaptor/map.hpp>
for(auto&& i : foo | boost::adaptors::map_values){
i->bar();
}
И он официально называется "диапазон для цикла", а не "цикл foreach".:)
std::map<float, MyClass*> foo;
for (const auto& any : foo) {
MyClass *j = any.second;
j->bar();
}
в С++ 11 (также известный как С++ 0x), вы можете сделать это, как в С# и Java
От С++ 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;
}