2011-05-11 20 views
1

私はstd::tr1::unordered_map<int, A> map;を持っています。ここで、Aはメンバ変数(int x)を持つクラスです。C++:boost :: lorddaを使ってstd :: tr1 :: unordered_mapの最大値を取得する

map [i] .xが最大であるようなマップのキーiを探したいと思います。

私はstd :: max_elementに行くためのファンクタを書くことができることを知っています。代わりに ブーストラムダ(私はそれを学ぼうとしています)を使用して、これを行うには?私はC++ 0xを持っていません。私は以下のように定義されたクラスAであった場合にどのような追加された質問として

クラスA { INT X。 int y; };

そして、私は最大w.r.t xを見つけたかったのです(その最大値が0ならば、最大のwrtをyにします)。 ここでも、1つの解決策はマップのタプル上で繰り返すことです(メモリ内に最大値 の両方を保持します)。これを行うためにmax_elementを変更する方法はありますか?

答えて

2

boost.lambdaはboost.bindを使用してメンバー変数にアクセスします。これは、冗長なビットをアップしています:

typedef std::tr1::unordered_map<int, A> map_t; 
map_t m; 

A max_a = std::max_element(m.begin(), m.end(), 
       bind(&A::x, bind(&map_t::value_type::second, _1)) 
       < bind(&A::x, bind(&map_t::value_type::second, _2)) 
     )->second; 

はテスト:https://ideone.com/V6SZL

あなたはboost.range

A max_a = *boost::max_element(m | map_values, bind(&A::x, _1) < bind(&A::x, _2)); 

で半分頭痛を救うかもしれないが、実際には、私が思うに、ファンクタは最高だろう。

1

Boost.Lambdaを学び始めたばかりなので、今は存在を忘れてBoost.Phoenixを覚えておいてください。 Boost.PhoenixはBoost.Lambdaの代替であると、かなりより強力な、そして多くの場合、より簡潔次のとおりです。

typedef std::tr1::unordered_map<int, A> map_t; 
map_t m; 

int i = std::max_element(
    m.begin(), 
    m.end(), 
    bind(&A::x, at_c<1>(_1)) < bind(&A::x, at_c<1>(_2)) 
)->first; 
A& max_a = m[i]; 

注Boost.Phoenix V2は現在Boost.Spiritのサブライブラリですが、1.47.0ブーストしていること。 Phoenix v3は、適切なスタンドアロンのBoostライブラリとしてリリースされる予定です。

+0

私はフェニックスの解決策を見ていきたいと考えています。 – Cubbi

関連する問題