我有一个std::list
,我想用从一组中选择的比较器进行排序。我想使用boost bind来定义比较器,这样我就可以隐式地为每个比较器定义一个函数。有什么影响:
struct MyStruct { int a; int b };
std::list<MyStruct> myList;
...
myList.sort(_1.a < _2.a);
以上代码无法编译。我的问题是,如何使用boost来内联比较器?
答案 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?