c++oding="utf-8" ?>
std::ranges::is_sorted只接受迭代器范围,不支持直接传容器;正确用法为std::ranges::is_sorted(v.begin(), v.end()),时间复杂度o(n),空间o(1),要求前向迭代器且可多次解引用。

std::ranges::is_sorted能直接用,但必须传迭代器范围
它不接受容器本身,只认 begin 和 end 迭代器。传 std::vector 或 std::array 本体直接编译失败,错误信息通常是 “no matching function for call to is_sorted”。
- 正确写法:
std::ranges::is_sorted(v.begin(), v.end()) - 支持 C 风格数组:
std::ranges::is_sorted(arr, arr + N) - 支持
std::string:std::ranges::is_sorted(s.begin(), s.end()) - 不能写成:
std::ranges::is_sorted(v)(C++20 起仍不支持容器重载)
默认按 比较,自定义比较要显式传第三个参数
它默认用 operator,升序判断。如果想检查降序、或按结构体字段排序,必须传比较函数——而且只能是二元谓词,不能是 lambda 捕获外部变量(除非是闭包对象且可默认构造)。
- 降序检查:
std::ranges::is_sorted(v.begin(), v.end(), std::greater{}) - 按
.name字段升序:std::ranges::is_sorted(v.begin(), v.end(), [](const auto& a, const auto& b) { return a.name - 注意:lambda 若含捕获(如
[x](){...}),无法满足std::predicate要求,编译报错
空序列和单元素序列都返回 true
这是标准定义行为,不是 bug。空范围没有违反有序性的元素对,单元素也不存在可比较的相邻对,因此都视为“已排序”。实际业务中若需排除这类情况,得额外判断 size() 。
-
std::vector<int>{};</int>→is_sorted(...)返回true -
std::array<int>{42};</int>→ 同样返回true - 若逻辑上“至少两个不同值才叫有序”,需手动加条件:
v.size() >= 2 && std::ranges::is_sorted(v.begin(), v.end())
性能与迭代器要求:只读、前向迭代器即可,不修改原数据
它内部只做单次遍历,时间复杂度 O(n),空间 O(1);不要求随机访问,std::list 或自定义前向迭代器容器也能用。但它会解引用每个相邻元素对,所以迭代器必须可多次解引用(即不能是输入迭代器,如 std::istream_iterator)。
- 可用:
std::list、std::forward_list(后者需确保非空时有至少两个节点) - 不可用:
std::istream_iterator,因为它是单次读取,第二次解引用未定义 - 所有操作都是只读的,原容器内容完全不变
<algorithm></algorithm>,且编译器需支持 C++20 并启用 /std:c++20(MSVC)或 -std=c++20(GCC/Clang)。某些旧版 libc++ 实现可能尚未完整支持,遇到链接错误先查标准库版本。C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











