std::is_sorted
来自 zh.cppreference.net
| 定义于头文件 <algorithm>
|
||
template< class ForwardIt >
bool is_sorted( ForwardIt first, ForwardIt last );
|
(1) | (C++11 起) (C++20 起 constexpr) |
template< class ExecutionPolicy, class ForwardIt >
bool is_sorted( ExecutionPolicy&& policy,
ForwardIt first, ForwardIt last );
|
(2) | (C++17 起) |
template< class ForwardIt, class Compare >
bool is_sorted( ForwardIt first, ForwardIt last, Compare comp );
|
(3) | (C++11 起) (C++20 起 constexpr) |
template< class ExecutionPolicy, class ForwardIt, class Compare >
bool is_sorted( ExecutionPolicy&& policy,
ForwardIt first, ForwardIt last, Compare comp );
|
(4) | (C++17 起) |
检查范围 [first, last) 中的元素是否按非降序排序。
3) 检查元素是否相对于
comp已排序。2,4) 与 (1,3) 相同,但根据
policy 执行。 这些重载仅当以下表达式的值为
true 时参与重载决议:
|
|
(C++20 前) |
|
|
(C++20 起) |
参数
| first, last | - | 定义需要检查的范围的迭代器对 |
| policy | - | 要使用的执行策略 |
| comp | - | 比较函数对象(即满足 Compare 要求的对象),如果第一个参数true小于(即顺序在第二个之前)则返回 。比较函数的签名应等价于以下形式:
虽然签名不必有 |
| 类型要求 | ||
-ForwardIt 必须满足 老式向前迭代器 的要求。
| ||
-Compare 必须满足 Compare 的要求。
| ||
返回值
true 如果范围中的元素按非降序排序则返回 false,否则返回。
复杂度
给定 N 为 std::distance(first, last):
1,2) O(N) 次比较,使用
operator<(C++20 前)std::less{}(C++20 起)。3,4) O(N) 次比较器
comp 的应用。异常
带有模板参数名为 ExecutionPolicy 的重载按如下方式报告错误:
- 如果作为算法一部分调用的函数的执行抛出异常,且
ExecutionPolicy是标准策略之一,则调用 std::terminate。对于任何其他ExecutionPolicy,行为由实现定义。 - 如果算法无法分配内存,则抛出 std::bad_alloc。
可能的实现
| is_sorted (1) |
|---|
template<class ForwardIt>
bool is_sorted(ForwardIt first, ForwardIt last)
{
return std::is_sorted_until(first, last) == last;
}
|
| is_sorted (3) |
template<class ForwardIt, class Compare>
bool is_sorted(ForwardIt first, ForwardIt last, Compare comp)
{
return std::is_sorted_until(first, last, comp) == last;
}
|
注解
std::is_sorted对于空范围和长度为 1 的范围,返回 true。
示例
运行此代码
#include <algorithm>
#include <cassert>
#include <functional>
#include <iterator>
#include <vector>
int main()
{
std::vector<int> v;
assert(std::is_sorted(v.cbegin(), v.cend()) && "an empty range is always sorted");
v.push_back(42);
assert(std::is_sorted(v.cbegin(), v.cend()) && "a range of size 1 is always sorted");
int data[] = {3, 1, 4, 1, 5};
assert(not std::is_sorted(std::begin(data), std::end(data)));
std::sort(std::begin(data), std::end(data));
assert(std::is_sorted(std::begin(data), std::end(data)));
assert(not std::is_sorted(std::begin(data), std::end(data), std::greater<>{}));
}
参阅
(C++11) |
寻找最大的已排序子范围 (函数模板 & 算法函数对象) |
(C++20) |
|
(C++20) |
检查范围是否已排序 (算法函数对象) |