std::sort可直接对vector快速排序,需传入合法迭代器范围和比较逻辑;默认升序、不稳定、原地排序,支持greater、lambda及自定义比较函数,须满足严格弱序。

直接用 std::sort 就能对 std::vector 快速排序,不需要手写快排,也不用担心稳定性(默认不稳定),关键是要传对迭代器范围和可选的比较逻辑。
基础用法:升序排序
对 vector 这类内置类型,默认按数值从小到大排:
- 头文件必须包含
- 调用形式是
std::sort(起始迭代器, 结束迭代器),注意结束迭代器是“末尾后一位”,通常用v.begin()和v.end() - 原地排序,不返回新容器,直接修改原 vector
#include#include std::vector v = {3, 1, 4, 1, 5}; std::sort(v.begin(), v.end()); // 排完后 v 变成 {1, 1, 3, 4, 5}
自定义降序排序
用 std::greater 或 lambda 表达式实现从大到小排:
- 用函数对象:
std::sort(v.begin(), v.end(), std::greater()) - 用 lambda 更灵活,比如对
vector按长度降序:std::sort(v.begin(), v.end(), [](const string& a, const string& b) { return a.size() > b.size(); }); - lambda 参数建议用 const 引用避免拷贝,尤其对 string、自定义类有效
对结构体或自定义类排序
核心是提供明确的“谁在前、谁在后”规则。有三种常用方式:
立即学习“C++免费学习笔记(深入)”;
- 重载
operator:让类支持默认小于比较,之后直接sort(v.begin(), v.end()) - 传 lambda:适合一次性逻辑,例如按结构体某个成员排序:
sort(v.begin(), v.end(), [](const Person& a, const Person& b) { return a.age - 传普通函数指针:适合复用逻辑,函数签名必须是
bool cmp(const T&, const T&)
注意事项和常见坑
几个容易出错但实际很关键的点:
- 迭代器必须合法:不能对空 vector 调用
v.begin()后再加偏移,但v.begin() == v.end()是安全的 - 比较函数必须满足严格弱序(strict weak ordering):比如不能写
a ,也不能让cmp(a,a)返回 true - 如果需要稳定排序(相同元素相对位置不变),改用
std::stable_sort - vector 必须是随机访问容器(它确实是),所以 sort 效率是 O(n log n),比 list 的 sort 高效得多










