C ++:使用boost lambda在std :: tr1 :: unordered_map中获取最大值

时间:2011-05-11 15:56:59

标签: c++ algorithm boost lambda

我有一个std::tr1::unordered_map<int, A> map;,其中A是一个带有成员变量(int x)的类。

我想在地图中找到关键字i,这样map [i] .x是最大的。

我知道我可以编写一个仿函数来使用std :: max_element。我怎样这样做,使用 提升lambda(我正在努力学习它)?我没有C ++ 0x。

作为一个补充问题,如果我将A类定义如下:

A级{  int x;  int y; };

我想找到最大w.r.t x(如果该最大值为0,则找到y的最大值)。 同样,一种解决方案是迭代地图的元组(保持两者 内存中的最大值)。有没有办法修改max_element来做到这一点?

2 个答案:

答案 0 :(得分: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 :(得分: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 Boost.Phoenix v3中将被发布为适当的独立Boost库。