通过std :: rel_ops

时间:2015-10-16 18:11:19

标签: c++ compare std

如何使用std::greater专门化std::rel_ops? 我有类似的东西

#include <utility>
#include <functional>

using namespace std::rel_ops;

struct MyStruct {
    int field;
    bool operator < (const MyStruct& rhs) const {
        return field < rhs.field;
    }
};

所以我需要按降序排序元素。如何使用operator <std::rel_opsstd::greater

来完成此操作

3 个答案:

答案 0 :(得分:4)

我假设你试图做类似

的事情
MyStruct ms[] = {{10}, {50}, {30}, {20}};
std::sort(std::begin(ms), std::end(ms), std::greater<MyStruct>{});

无法编译,因为找不到合适的operator>。这是因为std::greater依赖于ADL来查找运算符重载,并且ADL在关联的命名空间中进行搜索。 std::rel_ops不是MyStruct的关联命名空间。您可以通过将{using}声明添加到与MyStruct相同的命名空间来使所有内容工作,以便找到相关的operator>

using std::rel_ops::operator>;

Live demo

但这很丑陋,而且一般不是一个可行的解决方案,所以忘记std::rel_ops并使用Boost.Operators作为Barry suggests

答案 1 :(得分:1)

你必须这样做:

std::vector<MyStruct> v{...};

std::sort(v.begin(), v.end(), [](const MyStruct& lhs, const MyStruct& rhs){
    using namespace std::rel_ops;
    return lhs > rhs;
});

虽然std::rel_ops非常蹩脚。它更容易使用boost::less_than_comparable,您只需将操作符直接添加到MyStruct

struct MyStruct 
    : boost::less_than_comparable<MyStruct> // <== adds operator>,
                                            //          operator>=, 
                                            //      and operator<=
{
    MyStruct(int i) : field(i) { }
    int field;

    bool operator<(const MyStruct& rhs) const {
        return field < rhs.field;
    }
};

然后你可以用明显的方式对它进行排序:

std::sort(v.begin(), v.end(), std::greater<MyStruct>());

答案 2 :(得分:0)

std :: rel_ops会生成==<的其他比较,因此您首先需要定义至少<

bool operator<(const MyStruct & lhs, const MyStruct & rhs) {
    return lhs.field < rhs.field;
}

现在rel_ops会生成>,现在您可以在std::greater中使用std::sort

std::sort(begin(myVector), end(myVector), std::greater<MyStruct>());