c++ STL算法库sort如何使用 对vector进行排序【实用教程】

12次阅读

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

c++ STL算法库sort如何使用 对vector进行排序【实用教程】

直接用 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 高效得多

text=ZqhQzanResources