gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:44:57 27 4
gpt4 key购买 nike

我有一个 std::list,我想用从集合中选择的比较器对其进行排序。我想使用 boost bind 来定义比较器,这样我就可以为每个比较器隐式定义一个函数。效果如下:

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

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

最佳答案

我会使用 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?

关于c++ - 我可以使用 boost bind 来定义比较器来对 STL 列表进行排序吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23072126/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com