能否使用std::less比较两个char类型的数组?
首先你的代码里有两个基础问题:
- 模板第二个参数
M是数组长度的非类型参数,你写成了typename M,会直接导致编译失败,需要改成unsigned M。 - 你给
std::less指定的char const(&)[N]是固定长度N的字符数组引用类型,第二个参数b是长度为M的数组,类型不匹配自然无法实例化。而且默认std::less对数组/指针的比较是比较内存地址,不是你用strcmp时想要的字符串字典序,这个逻辑差异需要先明确。
如何用std::less完成两个数组的比较?
分两种场景处理:
场景1:仅比较两个数组的首地址大小
数组传入std::less时会隐式退化为const char*指针,直接指定模板参数为const char*即可:
#include <functional> template <unsigned N, unsigned M> bool compare(char const (&a)[N], char const (&b)[M]){ return std::less<const char*>()(a, b); }
场景2:实现和strcmp等价的字符串字典序比较
默认std::less没有针对C风格字符串的内容比较逻辑,你可以用C++17引入的std::string_view包装数组(无内存拷贝,性能和strcmp接近),std::less对std::string_view的特化会自动按字典序比较内容:
#include <functional> #include <string_view> template <unsigned N, unsigned M> bool compare(char const (&a)[N], char const (&b)[M]){ return std::less<std::string_view>()(a, b); }
如果你用的是C++14及更早版本,可以手动把strcmp的返回值封装到std::less的调用逻辑里。
std::less应该传入什么类型完成实例化?
- 如果是C++11及更早版本,只能比较同类型参数,两个不同长度的字符数组只能统一退化为
const char*,所以传入const char*即可,对应场景1的地址比较逻辑。 - 如果是C++14及以上版本,可以直接用泛型特化
std::less<void>(简写为std::less<>),不需要手动指定类型,它会自动推导参数类型支持异构比较,适合不想显式写参数类型的场景。
内容的提问来源于stack exchange,提问作者Itachi Uchiwa
相关产品推荐
相关产品推荐

