You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否使用std::less比较两个char类型的数组?

首先你的代码里有两个基础问题:

  1. 模板第二个参数M是数组长度的非类型参数,你写成了typename M,会直接导致编译失败,需要改成unsigned M。
  2. 你给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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 23:36:02