c++ - 如何使用 Boost 创建比较器?

标签 c++ boost

我是 Boost 的新手,但不是函数式编程的新手,我想看看 Boost 可以在哪些方面帮助我。

我有一个二维点列表,我想提取最小的 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:: 命名空间。

最佳答案

我不知道有任何类似于您的 Compare_by 的 boost 结构。
然而,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 生成的函数对象会重载很多常用的运算符,比如 <,所以你可以这样做:

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

关于c++ - 如何使用 Boost 创建比较器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3271048/

相关文章:

c++ - 期望在 GMock 中调用 Factory 返回 unique_ptr

c++ - 返回 shared_ptr 时如何实现协变返回类型?

c++字符串容量在复制分配期间发生变化

c++ - 将指针转换为 STL 中的反向 vector 迭代器

c++ - 为什么由 fork() 拆分的进程不以相同的方式执行此函数?

c++ - 如何编写模板类方法的特化

c++ - boost::asio async_send 错误

c++ - Boost Graph 查找一组顶点的邻居

c++ - boost signals2 - 通过插槽断开连接时出错

c++ - boost 日期时间库的夏令时和其他时区相关问题