c++oding="utf-8" ?>
std::sort对c++原生数组排序需传首尾指针,正确写法为std::sort(arr, arr + n);仅传arr会编译失败,因函数要求两个迭代器参数界定范围。

std::sort 排序 C++ 原生数组要传首尾指针
直接对 int arr[5] 调用 std::sort(arr) 会编译失败,因为 std::sort 需要两个迭代器(或指针)界定范围,不是单个数组名。
正确写法是传入起始地址和末尾地址的下一个位置:std::sort(arr, arr + n),其中 n 是元素个数。
常见错误现象:error: no matching function for call to 'sort(int [5])' —— 就是因为只传了一个参数。
- 对
int a[10]排序:用std::sort(a, a + 10) - 对部分区间排序(比如前 7 个):用
std::sort(a, a + 7) - 不能写成
std::sort(a, a + sizeof(a))——sizeof(a)返回字节数,不是元素个数
std::sort 默认升序,但得确保类型支持
std::sort 默认按 比较,所以内置类型(<code>int、double、char)直接可用;自定义结构体必须重载 operator,否则编译报错:<code>invalid operands to binary expression ('MyStruct' and 'MyStruct')。
使用场景:比如有个 struct Point { int x, y; };,想按 x 升序排,就得写:
bool operator
- 不重载
operator,又不想改结构体?用 lambda 作为第三个参数(见下一条) - 浮点数用
std::sort排序要小心精度问题,double相等判断不可靠,但升序本身没问题 - 排序不稳定 —— 相等元素的相对位置可能改变;需要稳定排序请用
std::stable_sort
用 lambda 自定义排序逻辑(降序、多条件等)
第三个参数是可调用对象,最常用的是 lambda。比如降序排列 int arr[5]:
std::sort(arr, arr + 5, [](int a, int b) { return a > b; });
多条件排序(先按 y 升序,y 相同时按 x 降序):
std::sort(points, points + n, [](const Point& a, const Point& b) {
if (a.y != b.y) return a.y b.x;
});
- lambda 必须返回
bool,且满足严格弱序(不能写a ) - 捕获外部变量需谨慎:默认不捕获,如需访问局部变量,用
[&]或[=],但注意生命周期 - 性能上,简单 lambda 和函数指针几乎无差别,编译器通常能内联
std::sort 对 std::array 和 std::vector 同样适用
std::array 是聚合类型,支持 .data() 和 .size(),所以排序方式一致:std::sort(arr.data(), arr.data() + arr.size())。std::vector 更方便,有 .begin() / .end():
std::vector<int> v = {3, 1, 4};
std::sort(v.begin(), v.end()); // 升序
</int>
-
std::vector::end()返回的是 past-the-end 迭代器,正好匹配std::sort的右边界语义 - 不要对空容器调用
sort(v.begin(), v.end())—— 虽然标准允许,但某些旧 libstdc++ 版本可能出问题;加个if (!v.empty())更稳妥 -
std::array的大小必须在编译期确定,而std::sort不关心这点,只看指针运算是否合法
operator 时错误提示不够直观。写的时候多看一眼参数类型和比较逻辑,比事后调试快得多。C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











