我可以使用boost bind来定义用于对STL列表进行排序的比较器吗?

时间:2014-04-14 23:27:50

标签: c++ boost

我有一个std::list,我想用从一组中选择的比较器进行排序。我想使用boost bind来定义比较器,这样我就可以隐式地为每个比较器定义一个函数。有什么影响:

struct MyStruct { int a; int b };
std::list<MyStruct> myList;
...
myList.sort(_1.a < _2.a);

以上代码无法编译。我的问题是,如何使用boost来内联比较器?

1 个答案:

答案 0 :(得分:2)

我使用Boost Phoenix:

#include <boost/phoenix.hpp>
#include <list>

namespace phx = boost::phoenix;
using namespace phx::arg_names;

struct MyStruct { int a; int b; };

int main()
{
    std::list<MyStruct> myList;
    //...
    myList.sort(phx::bind(&MyStruct::a, arg1) < phx::bind(&MyStruct::b, arg2));
}

注意,比较不同的字段似乎非常奇怪(除非字段有一些保证的冗余关系(例如:它们总是相等),它将不满足严格弱的总排序的要求 - 大多数STL容器需要/采用比较器的算法。

避免两者

  • 比较器的详细程度,以及
  • 左手/右手侧有不同加速器的风险

我通常使用帮手(c ++ 03):

#include <boost/bind.hpp>
#include <list>

template <typename F>
struct compare_by_impl {
    compare_by_impl(F f = F()) : _f(f) {}

    template <typename T, typename U>
    bool operator()(T const& a, U const& b) const {
        return _f(a) < _f(b);
    }
  private:
    F _f;
};

template <typename Accessor>
compare_by_impl<Accessor> comparer_by(Accessor f) {
    return compare_by_impl<Accessor>(f);
}

struct MyStruct { int a; int b; };

int main()
{
    std::list<MyStruct> myList;
    //...
    myList.sort(comparer_by(boost::mem_fn(&MyStruct::a)));
}

这不再使用Boost Phoenix了。看到 Live on Coliru

在此处查看更新的c ++ 11版本:How to implement a lambda function for a sort algorithm involving object members, indirection, and casting?