boost::for_each で、std::map の second や first を抽出
タイトルがすごくピンポイントですが……。
boost::for_each で std::map を捜査する際に、first や second のみ抽出したい!
みたいな処理が Boost.Lambda で比較的、簡単に書くことが出来ました。
#include <boost/range/algorithm/for_each.hpp> #include <boost/lambda/lambda.hpp> #include <boost/assign.hpp> #include <iostream> #include <map> typedef std::map<char, int> map; typedef map::value_type pair; int main(){ using namespace boost::assign; namespace lambda = boost::lambda; using lambda::_1; map m = map_list_of('A',1)('J',11)('Q',12)('K',13); boost::for_each(m, std::cout << &_1->* &pair::first << ',' << &_1->* &pair::second << "\n"); // second の合計を計算 int sum = 0; boost::for_each(m, sum += &_1->* &pair::second); std::cout << sum << std::endl; return 0; }
[出力]
A,1 J,11 K,13 Q,12 37
Boost.Lambda が変態過ぎる……。
[boost]
ver 1.46.1
[参照]
http://d.hatena.ne.jp/faith_and_brave/20101109/1289274465
[追記]
std::map 用の range がすでに用意されているらしいです。
#include <boost/range/adaptor/map.hpp> #include <boost/range/algorithm/for_each.hpp> #include <boost/lambda/lambda.hpp> #include <boost/assign.hpp> #include <iostream> #include <map> typedef std::map<char, int> map; typedef map::value_type pair; int main(){ using namespace boost::assign; namespace lambda = boost::lambda; using lambda::_1; namespace adaptors = boost::adaptors; map m = map_list_of('A',1)('J',11)('Q',12)('K',13); // second の合計を計算 int sum = 0; boost::for_each(m|adaptors::map_values, sum += _1); std::cout << sum << std::endl; return 0; }
こっちの方が分かりやすいですね。