为何std::less<>特化可用于map却无法用于sort?
这个问题其实是因为std::map和std::sort默认依赖的比较逻辑不一样导致的,我来给你拆解清楚:
为什么std::map能正常工作?
std::map的模板参数里,默认的比较器就是std::less<Key>——也就是你在std命名空间里特化的那个版本。当你声明std::map<MyClass, ...>时,它会直接使用你特化的less<MyClass>来比较键值,所以完全能正常运行。
为什么std::sort会编译错误?
和map不同,std::sort的默认行为是调用**元素类型的operator<**来做比较,它不会主动去查找std::less<>的特化版本。你的MyClass没有重载operator<,编译器找不到合法的比较方式,自然就抛出编译错误了。
解决办法有两种,选哪种看你的需求:
给
MyClass重载operator<
这是最通用的方式,能让所有依赖默认比较逻辑的标准库算法(包括sort)都正常工作:class MyClass { public: MyClass(int i): val(i) {} int val; // 重载operator<,实现小于比较逻辑 bool operator<(const MyClass& other) const { return this->val < other.val; } };调用
sort时显式指定比较器
如果不想给类重载operator<,可以在调用sort的时候手动传入std::less<MyClass>的实例:std::vector<MyClass> my_vec = {MyClass(3), MyClass(1), MyClass(2)}; // 显式指定用你特化的std::less<MyClass>作为比较规则 std::sort(my_vec.begin(), my_vec.end(), std::less<MyClass>());
额外小提醒
虽然C++标准允许对用户自定义类型特化std命名空间里的模板,但一般更推荐优先重载operator<(如果逻辑上确实有“小于”的语义),或者提供独立的自定义比较器,这样代码的可读性和兼容性会更好~
内容的提问来源于stack exchange,提问作者saha
相关产品推荐
相关产品推荐

