如何使用Boost创建比较器?

时间:2010-07-17 10:13:58

标签: c++ boost

我是Boost的新手,但不是函数式编程,我正试图看看Boost可以帮助我的地方。

我有一个2D点列表,我想提取最小x坐标。 Point类有一个成员函数float x() const,所以我可以使用boost::mem_fn,如下所示:

boost::mem_fn(&Point::x)

但是为了使用std::min_element,我需要一个支持bool operator()(Point const &, Point const &)的对象。像这个虚构的compare_by

leftmostPoint = std::min_element(
    points.begin(), points.end(),
    boost::compare_by(boost::mem_fn(&Point::x)));

我可以使用Boost构建这样的比较,还是我自己需要这样做?


更新:这是我自己的实现,但我仍然有兴趣看看Boost如何为我做到这一点。

template<typename F>
class CompareBy {
    F const d_f;
    public:
        CompareBy(F f) : d_f(f) { }
        template<typename T>
        bool operator()(T const &a, T const &b) const {
            return d_f(a) < d_f(b);
        }
};

template<typename F>
CompareBy<F> compare_by(F f) {
    return CompareBy<F>(f);
}

用法:如上所述,减去boost::命名空间。

1 个答案:

答案 0 :(得分:4)

我不知道任何类似于你的Compare_by的助推器构造 但是,boost :: bind可以解决问题。

Point leftmostPoint = *std::min_element(points.begin(), points.end(),
   boost::bind(std::less<Point::type_x>(), 
       boost::bind( &Point::x, _1 ), boost::bind( &Point::x, _2 )));

是的,那不漂亮:/
幸运的是,有一个语法快捷方式,因为boost :: bind生成的函数对象会重载很多常用的运算符,比如&lt;,所以你可以这样做:

Point leftmostPoint2 = *std::min_element(points.begin(), points.end(),
boost::bind( &Point::x, _1 ) < boost::bind( &Point::x, _2 ));

但我认为只有C ++ 0X的lambda才能真正实现简洁清晰度:

Point leftmostPoint3 = *std::min_element(points.begin(), points.end(),
[](const Point& p1, const Point& p2){ return p1.x < p2.x; });