少的专业化<>适用于地图但不适用于排序

Specialization of less<> works with map but not with sort

本文关键字:适用于 不适用 排序 地图 lt gt 专业化      更新时间:2023-10-16

我有一个自定义类和该类的less<>专业化。我在班上没有任何operator<。代码如下所示:

class MyClass
{
public:
    MyClass(int i): val(i) {}
    int val;
};
namespace std
{
    template<> struct less<MyClass>
    {
       bool operator() (const MyClass& a, const MyClass& b) const { return a.val < b.val; }
    };
}

现在,如果我创建类的 STL 映射作为键,那么工作正常。但是,如果我尝试对这些对象的向量进行排序,那么就会给出缺少operator<的编译错误。

谁能解释为什么?

std::sort 在没有提供比较器时,使用 operator< 进行比较,而不是std::less

从标准,[alg.sorting],第一段

[alg.sorting] 中的所有操作都有两个版本:一个采用 Compare 类型的函数对象,另一个使用运算符<。

std::map没有两个版本。它有一个版本,默认模板参数默认为 std::less<key> 。它不能直接使用operator<(或者至少这样做会很麻烦(,因为这样比较器的类型实际上必须是一个函数指针,并且用户必须始终将指向构造函数的相应operator<的指针传递给构造函数。这将是一种痛苦。通过默认为类型 std::less<key> ,映射可以只使用此类型的默认构造对象作为其比较器。

相关文章: