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

And*_*hko 8 c++ boost-bind boost-lambda

我有std::map<int, std::pair<short, float> >,我需要short在这张地图中找到最小值.我该怎么boost::bindstd::min_element()

boost::lambda

Rob*_*edy 6

map迭代器会给你一个pair地方firstint关键,并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;
Run Code Online (Sandbox Code Playgroud)

我们将使用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;
Run Code Online (Sandbox Code Playgroud)

这也适用boost::lambda::bind.


eph*_*ent 5

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;
Run Code Online (Sandbox Code Playgroud)

(当然,有人会抱怨这是滥用STL而且这些扩展不在C++标准中......)