如何使用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_ops
和std::greater
?
答案 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>;
但这很丑陋,而且一般不是一个可行的解决方案,所以忘记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>());