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

时间:2018-03-22 00:53:47

标签: c++ stl

我有一个自定义类和该类的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<而导致编译错误。

任何人都可以解释原因吗?

1 个答案:

答案 0 :(得分:0)

std::sort,如未提供比较器,则使用operator<进行比较,而不是std::less

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

  

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

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