函数模板
<algorithm>

std::is_sorted_until

默认 (1)
template <class ForwardIterator>  ForwardIterator is_sorted_until (ForwardIterator first, ForwardIterator last);
自定义 (2)
template <class ForwardIterator, class Compare>  ForwardIterator is_sorted_until (ForwardIterator first, ForwardIterator last,                                   Compare comp);
查找范围内的第一个未排序元素
返回指向范围 [first,last) 中第一个不遵循升序的元素的迭代器。

first 指向的元素和返回的迭代器之间的范围 是已排序的

如果整个范围都是排序的,则函数返回 last

元素使用第一个版本的 operator< 进行比较,第二个版本使用 comp 进行比较。

此函数模板的行为等同于
1
2
3
4
5
6
7
8
9
10
11
template <class ForwardIterator>
  ForwardIterator is_sorted_until (ForwardIterator first, ForwardIterator last)
{
  if (first==last) return first;
  ForwardIterator next = first;
  while (++next!=last) {
    if (*next<*first) return next;
    ++first;
  }
  return last;
}

参数

first, last
前向迭代器,指向序列的初始位置和最终位置。检查的范围是 [first,last),它包含 first 和 last 之间的所有元素,包括 first 指向的元素,但不包括 last 指向的元素。
comp
二元函数,它接受范围内的两个元素作为参数,并返回一个可转换为 bool 的值。返回的值指示传递的第一个参数是否被认为在它定义的特定严格弱序中排在第二个参数之前。
该函数不得修改其任何参数。
这可以是指向函数的指针,也可以是函数对象。

返回值

指向范围中第一个不遵循升序的元素的迭代器,或者如果所有元素都已排序或范围包含的元素少于两个,则返回 last

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// is_sorted_until example
#include <iostream>     // std::cout
#include <algorithm>    // std::is_sorted_until, std::prev_permutation
#include <array>        // std::array

int main () {
  std::array<int,4> foo {2,4,1,3};
  std::array<int,4>::iterator it;

  do {
    // try a new permutation:
    std::prev_permutation(foo.begin(),foo.end());

    // print range:
    std::cout << "foo:";
    for (int& x:foo) std::cout << ' ' << x;
    it=std::is_sorted_until(foo.begin(),foo.end());
    std::cout << " (" << (it-foo.begin()) << " elements sorted)\n";

  } while (it!=foo.end());

  std::cout << "the range is sorted!\n";

  return 0;
}

输出
foo: 2 3 4 1 (3 elements sorted)
foo: 2 3 1 4 (2 elements sorted)
foo: 2 1 4 3 (1 elements sorted)
foo: 2 1 3 4 (1 elements sorted)
foo: 1 4 3 2 (2 elements sorted)
foo: 1 4 2 3 (2 elements sorted)
foo: 1 3 4 2 (3 elements sorted)
foo: 1 3 2 4 (2 elements sorted)
foo: 1 2 4 3 (3 elements sorted)
foo: 1 2 3 4 (4 elements sorted)
the range is sorted!


复杂度

最多线性于 firstlast 之间的距离:为每个元素调用 comp 直到找到不匹配项。

数据竞争

范围 [first,last) 中的一些(或全部)对象被访问(最多一次)。

异常

如果 comp 或迭代器上的操作抛出异常,则此函数将抛出异常。
请注意,无效的参数会导致 *未定义行为*。

另见