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

こっちの方が分かりやすいですね。