少的专业化<>适用于地图但不适用于排序
Specialization of less<> works with map but not with sort
我有一个自定义类和该类的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>
,映射可以只使用此类型的默认构造对象作为其比较器。
相关文章:
- OpenGL - 在 NDC 中计算位置适用于着色器,但不适用于'regular'程序
- 使用模板参数重载C++方法:如何使其适用于模板的子类?
- 如何修复我的最大公约数代码?它适用于除零和零以外的所有数字
- 选择排序C++(已修改)并非适用于所有情况
- 无法让"std::enable_if"适用于无作用域枚举
- 请找出我的代码中的错误,它在提交得到错误答案的同时仍然适用于我的所有测试用例
- 确定夏令时是否适用于特定日期
- 是否有一种 STL 算法可以最后找到,但它也适用于指针?
- 十进制到二进制的实现不能完全适用于我大学的检查器。问题或提示可能是什么
- 使用程序集嵌入数据时"Undefined reference"错误,使用适用于窗口的 mingw-w64 编译(COFF 而不是 ELF)
- 为什么 std::vector 适用于类定义中的不完整类型?
- 为什么哈希<常量字符*>适用于字符串而不是字符串变量?
- Lambda适用于最新的Visual Studio,但在其他地方不起作用
- 我该如何文档文档以使文档适用于类成员而不是匿名类型
- 计算 c# 中二进制文件符号的频率不起作用,但适用于等效的 c++ 代码
- 为什么 fstream.open(文件名) 适用于文字而不是生成的字符串?
- 模板重载和 SFINAE 仅适用于函数而不是类
- 为什么链接器不抱怨多个函数定义(仅适用于模板化函数)
- 我可以使用' == '来比较两个向量吗?我试过了,似乎工作正常。但我不知道它是否适用于更复杂的情况
- 延长临时的生命周期,适用于块范围的聚合,但不是通过"新";为什么?