我是 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/