我有一个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来做到这一点?
答案 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;
你可以用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库。