如何在复合类型上使用Boost.Bind?

我有
std::map<int, std::pair<short, float> >
,我需要在这张地图中找到最小的
short
。我怎么能用
boost::bind
std::min_element()
这个?
boost::lambda
?     
已邀请:
map
迭代器会给你一个
pair
,其中
first
int
键,
second
是地图的
pair
值,所以如果你有一个迭代器
it
,你需要所有
it->second.first
值的最小值。
min_element
函数需要第三个参数的比较函数,因此您需要构建一个比较函数,该函数投影其两个参数的
second.first
。 我们将从一些typedef开始,使代码更具可读性:
typedef std::pair<short, float> val_type;
typedef std::map<int, val_type> map_type;
map_type m;
我们将使用Boost.Lambda作为其重载运算符,允许我们使用
operator<
。 Boost.Bind可以绑定成员变量以及成员函数,因此我们也将利用它。
#include <boost/bind.hpp>
#include <boost/lambda/lambda.hpp>
using boost::bind;

// Comparison is (_1.second.first < _2.second.first)
std::cout <<
  std::min_element(m.begin(), m.end(),
    bind(&val_type::first, bind(&map_type::iterator::value_type::second, _1))
    <
    bind(&val_type::first, bind(&map_type::iterator::value_type::second, _2))
  )->second.first;
这也适用于
boost::lambda::bind
。     
min_element(map.begin(), map.end(),
            compose2(less<short>(),
                     compose1(select1st<pair<short, float> >(),
                              select2nd<map<int, pair<short, float>
                                           >::value_type>()),
                     compose1(select1st<pair<short, float> >(),
                              select2nd<map<int, pair<short, float>
                                           >::value_type>()))
           ).second.first;
(当然,有人会抱怨这是滥用STL而且这些扩展不在C ++标准中......)     
bind
不能单独做到这一点,因为
first
second
是作为字段而不是方法公开的(所以你不能get23ѭ这样的东西)。 你当然可以使用自己的仿函数来做到这一点:
template <typename F, typename S>
struct select_first : std::binary_function<std::pair<F, S>&, F&>
{
    F& operator()(std::pair<F, S>& toConvert)
    {
        return toConvert.first;
    }
};
    

要回复问题请先登录注册