必须写成 std::sort(arr, arr + n, std::greater()),因 greater 在 std 命名空间中;用于 vector 同理;自定义类型需重载 operator> 或用 lambda;降序后二分查找须同步传 std::greater()。

sort 用 greater 必须加命名空间
直接写 sort(arr, arr + n, greater<int>())</int> 会编译失败,因为 greater 在 std 命名空间里。不加 std:: 前缀,编译器根本找不到这个函数对象。
常见错误现象:error: 'greater' was not declared in this scope
- 必须写成
std::sort(arr, arr + n, std::greater<int>())</int> - 如果用了
using namespace std;,可以省略std::,但不推荐——尤其在头文件或大型项目里容易引发符号冲突 -
greater<int></int>只对int数组安全;换成double或自定义类型就得换对应模板参数,比如std::greater<double>()</double>
vector 降序也一样,但注意迭代器写法
对 std::vector<int> v</int> 排降序,别写成 sort(v.begin(), v.end(), greater<int>())</int> —— 这语法没错,但容易漏掉 std::,而且和数组写法不统一。
更稳妥的写法是显式带上命名空间:
std::sort(v.begin(), v.end(), std::greater<int>()); </int>
-
v.begin()和v.end()返回的是随机访问迭代器,和数组指针行为一致,std::greater完全适用 - 如果 vector 存的是指针(如
vector<string></string>),要用std::greater<string>()</string>,否则比较的是地址值,不是字符串内容 - 不要误用
std::greater<void>()</void>(C++14 起支持泛型,但可读性差、易出错,不建议新手碰)
greater 不是万能的,慎用于自定义结构体
想对 struct Person { int age; string name; }; 按 age 降序排?直接写 std::greater<person>()</person> 会报错:没有定义 operator>。
- 要么给结构体重载
operator>,要么用 lambda 替代:[](const Person& a, const Person& b) { return a.age > b.age; } -
std::greater只适用于内置类型或已定义严格弱序关系的类型(比如有operator>且满足传递性) - 即使有
operator>,也要确保它语义合理——比如浮点数用>比较可能因精度导致排序不稳定
降序排列后,二分查找得换函数
数组降序排完,别再用 std::lower_bound 直接查——它默认按升序逻辑找,结果错得离谱。
- 必须传入相同比较器:
std::lower_bound(arr, arr + n, x, std::greater<int>())</int> - 同理,
std::upper_bound、std::binary_search都要同步加std::greater<int>()</int> - 漏掉这个参数,编译通过但运行时逻辑全乱:可能返回错误位置,甚至越界访问
greater 看似简单,但命名空间、类型匹配、配套算法这三处最容易漏掉细节。特别是降序后接着做二分操作时,很多人只改了 sort,忘了改查找函数的比较器。C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











