std::sort对vector排序最直接,默认升序、o(n log n),需随机访问迭代器;升序用sort(v.begin(),v.end()),降序加std::greater,自定义比较用lambda。

用 std::sort 对 vector 排序最直接
绝大多数情况,直接调用 std::sort 就够了,它默认升序,时间复杂度稳定在 O(n log n),底层通常是 introsort(快排+堆排+插排混合)。注意它要求迭代器支持随机访问——vector 完全满足。
常见错误是传错迭代器范围:漏掉 .end() 或写成 .begin() + size()(虽等价但不推荐,冗余且易错)。
- 升序:
std::sort(v.begin(), v.end()); - 降序:
std::sort(v.begin(), v.end(), std::greater<int>());</int> - 自定义比较(比如按绝对值):
std::sort(v.begin(), v.end(), [](int a, int b) { return abs(a)
排序 vector 里的自定义类型要重载或传比较函数
如果 vector<person></person> 这类类型没定义 operator,<code>std::sort 会编译失败,报错类似 invalid operands to binary expression。
两种解法:要么在类里加 bool operator;要么外部传 lambda 或函数对象。后者更灵活,尤其当排序逻辑多变时(比如有时按年龄、有时按姓名)。
- 类内定义:
bool operator - 外部传 lambda:
std::sort(people.begin(), people.end(), [](const Person& a, const Person& b) { return a.name - 注意 lambda 捕获列表为空即可,别误写成
[&]——除非真需要修改外部变量
std::stable_sort 和 std::sort 的关键区别在哪
当 vector 中有多个等价元素(比如相同分数的学生),你希望它们原始的相对顺序不变,就必须用 std::stable_sort。它保证相等元素的稳定性,但通常比 std::sort 稍慢,空间开销也可能略大(可能用到额外 O(n) 内存)。
典型场景:先按班级排序,再按分数排序,又想保留同分者进班的先后顺序——这时第二次排序必须用 std::stable_sort。
- 稳定排序:
std::stable_sort(v.begin(), v.end(), cmp); - 性能提示:小数组(比如 size
- 头文件仍是
<algorithm></algorithm>,无需额外引入
排序后想取前 N 个?别先全排再截断
如果只关心最小的 3 个数,对百万级 vector 调用 std::sort 是浪费。改用 std::partial_sort 或 std::nth_element 更高效。
std::partial_sort(v.begin(), v.begin() + 3, v.end()); 会让前 3 个位置放最小的 3 个(已排序),其余位置无序;而 std::nth_element 只保证第 N 位正确,前后不保证有序,但更快。
- 要“前 N 小且有序” → 用
std::partial_sort - 只要“第 N 小的值是多少”或“把前 N 小放到前面,不要求它们之间有序” → 用
std::nth_element - 两者都要求随机访问迭代器,
vector没问题;但list就不行,得换思路
std::sort 加 lambda 就能干净解决;剩下 10% 要么涉及稳定性,要么只取 Top-K,这时候才需要伸手去够那几个更专一的算法。别过早优化,但得知道边界在哪。C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











