C++中std::less<>的<>作用是什么?与std::less<T>有何区别?
std::less<> 中 <> 的作用与两种写法的区别 你看到的空尖括号<>,在这里表示使用类模板的默认模板参数实例化类型。对于标准库的std::less来说,从C++14开始主模板声明为template <typename T = void> struct less;,因此写std::less<>等价于显式写std::less<void>,这是标准库提供的透明比较器特化版本。
两种默认模板参数写法的核心差异如下:
- 第一种写法:
template <typename T, typename C = std::less<>>- 默认传入的是透明比较器,它的
operator()是泛型成员模板,不会提前绑定固定的参数类型,调用时会自动推导实参类型。 - 原生支持异构比较:比如当容器元素类型是
std::string时,你可以直接传入std::string_view、const char*等可与std::string做<比较的类型做查找、排序操作,不会触发不必要的类型转换,也不会生成临时对象,性能更好。 - 对泛型场景的适配性更强,不会因为比较参数和T类型不完全匹配就出现编译错误或者额外开销。
- 默认传入的是透明比较器,它的
- 第二种写法:
template <typename T, typename C = std::less<T>>- 这是C++11及更早版本的通用写法,默认比较器会严格绑定到模板参数T的类型。
- 它的
operator()只接受T类型的参数,如果传入其他可比较类型,会强制隐式转换为T类型,很容易产生额外的临时对象构造开销,遇到无法隐式转换的类型时会直接编译失败。 - 举个典型场景:如果T是
std::string,传入const char*做比较时,会先构造一个临时的std::string对象,产生无意义的内存分配开销。
补充:目前C标准库的有序容器(
std::set、std::map等)从C14开始已经全面支持透明比较器,编写泛型工具代码时,优先使用std::less<>作为默认比较参数是更通用、性能更优的选择。
内容的提问来源于stack exchange,提问作者Sz. David
相关产品推荐
相关产品推荐

