繁体   English   中英

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

[英]C++: Using boost lambda to get maximum values in a std::tr1::unordered_map

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

我想在map中找到键i,以使map [i] .x最大。

我知道我可以编写一个函子来与std :: max_element一起使用。 我如何使用boost lambda来做到这一点(我正在尝试学习)? 我没有C ++ 0x。

另外一个问题是,如果我的A类定义如下:

A类{int x; 诠释 };

我想找到最大wrt x(如果最大为0,则将最大wrt设为y)。 同样,一种解决方案是遍历映射的元组(将两个最大值保留在内存中)。 有没有办法修改max_element来做到这一点?

boost.lambda使用boost.bind访问成员变量。 它有点罗word:

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

但我认为在实践中,最好使用函子。

由于您刚刚开始学习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库发布。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM