C ++ primer,5th,14.8.2,使用带有算法的库函数对象:
vector<string *> nameTable; // vector of pointers
// error: the pointers in nameTable are unrelated, so < is undefined
sort(nameTable.begin(), nameTable.end(),
[](string *a, string *b) { return a < b; });
// ok: library guarantees that less on pointer types is well defined
sort(nameTable.begin(), nameTable.end(), less<string*>());
然后我检查了std :: less实现:
template<typename _Tp>
struct less : public binary_function<_Tp, _Tp, bool>
{
bool
operator()(const _Tp& __x, const _Tp& __y) const
{ return __x < __y; }
};
我发现std :: less也使用operator&lt;做这项工作,为什么&lt;是未定义的,库保证较少的指针类型被很好地定义,为什么std:少推荐,为什么std ::不如&lt;。
答案 0 :(得分:9)
因为<
并非总是operator<()
。只有类具有操作符函数,因此您的建议不适用于内置类型。
此外,指针上的<
不一定实现严格弱的排序,而std::less
(通过专业化 - 你发布的不是std::less
的“全部”!) is required to:
对于任何指针类型,std :: less的特化产生严格的总顺序,即使内置运算符&lt;没有。
简而言之: std::less
适用于任何支持低于比较的内容。