函数模板
<algorithm>

std::is_heap_until

默认 (1)
template <class RandomAccessIterator>  RandomAccessIterator is_heap_until (RandomAccessIterator first,                                      RandomAccessIterator last);
自定义 (2)
template <class RandomAccessIterator, class Compare>  RandomAccessIterator is_heap_until (RandomAccessIterator first,                                      RandomAccessIterator last                                      Compare comp);
查找不在堆顺序中的第一个元素
返回一个迭代器,指向范围 [first,last) 中第一个元素,该元素如果被视为堆(如同用 make_heap 构建一样),则不在有效位置。

范围 [first, 返回的迭代器 ) 是一个堆。

如果整个范围是有效的堆,则函数返回 last

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

参数

first, last
随机访问迭代器 指向序列的初始和最终位置。被检查的范围是 [first,last),它包含 firstlast 之间的所有元素,包括 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
// is_heap example
#include <iostream>     // std::cout
#include <algorithm>    // std::is_heap_until, std::sort, std::reverse
#include <vector>       // std::vector

int main () {
  std::vector<int> foo {2,6,9,3,8,4,5,1,7};

  std::sort(foo.begin(),foo.end());
  std::reverse(foo.begin(),foo.end());

  auto last = std::is_heap_until (foo.begin(),foo.end());

  std::cout << "The " << (last-foo.begin()) << " first elements are a valid heap:";
  for (auto it=foo.begin(); it!=last; ++it)
    std::cout << ' ' << *it;
  std::cout << '\n';

  return 0;
}

大多数实现认为逆序排列的范围是有效的堆
可能的输出
The 9 first elements are a valid heap: 9 8 7 6 5 4 3 2 1


复杂度

最多线性于 firstlast 之间的距离:比较元素直到找到不匹配为止。

数据竞争

访问范围 [first,last) 中的对象。

异常

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

另见