函式模板
<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 或迭代器上的操作丟擲異常,則丟擲異常。
請注意,無效的引數會導致 *未定義行為*。

另見