當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


C++ Algorithm is_heap()用法及代碼示例


C++算法is_heap()函數用於檢查[first, last)範圍內的元素是否構成堆。如果指定範圍內的元素形成堆,則返回 true。

對於第一個版本使用運算符 < 比較元素,或者對於第二個版本使用給定的二進製比較函數 comp 比較元素。

用法

default (1)           template <class RandomAccessIterator>
                  bool is_heap (RandomAccessIterator first, RandomAccessIterator last);

custom (2)      template <class RandomAccessIterator, class Compare>
                bool is_heap (RandomAccessIterator first, RandomAccessIterator last,
                                          Compare comp);

參數

first:一個隨機訪問迭代器,指向一個範圍的第一個元素來檢查堆。

last:一個隨機訪問迭代器,指向範圍中過去的最後一個元素以檢查堆。

comp: 一個用戶定義的二元謂詞函數,它接受兩個參數,如果兩個參數按順序返回真,否則返回假。它遵循嚴格的弱排序來對元素進行排序。

返回值

如果指定範圍內的元素形成堆,則返回真,否則返回假。

複雜度

複雜度高達線性,比第一個和最後一個之間的距離小:比較元素對,直到發現不匹配。

數據競爭

訪問範圍 [first, last) 中的對象。

異常

如果元素比較或迭代器上的操作引發異常,則此函數將引發異常。

注意:無效的參數會導致未定義的行為。

例子1

讓我們看一個簡單的例子來演示 is_heap() 的使用:

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main()
{
  vector<int> v = {3, 1, 4};

  cout << boolalpha;

  cout << "before:is heap? "
            << is_heap(v.begin(), v.end()) << endl;

  make_heap(v.begin(), v.end());
  cout << " after:is heap? "
            << is_heap(v.begin(), v.end()) << endl;
            
return 0;
}

輸出:

before:is heap? false
 after:is heap? true

例子2

讓我們看另一個簡單的例子:

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;
 
int main()
{
    vector<int> v { 2, 3, 4, 1, 5, 9 };
 
    cout << "initially, v:";
    for (auto i:v) cout << i << ' ';
    cout << '\n';
 
    if (!is_heap(v.begin(), v.end())) {
        cout << "making heap...\n";
        make_heap(v.begin(), v.end());
    }
 
    cout << "after make_heap, v:";
    for (auto i:v) cout << i << ' ';
    cout << '\n';
    
    return 0;
}

輸出:

initially, v:2 3 4 1 5 9 
making heap...
after make_heap, v:9 5 4 1 3 2 

例子3

讓我們看另一個簡單的例子:

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

bool ignore_case(char a, char b) {
   return (tolower(a) == tolower(b));
}

int main(void) {
   vector<char> v = {'E', 'd', 'C', 'b', 'A'};
   bool result;

   result = is_heap(v.begin(), v.end());

   if (result == false)
      cout << "Given sequence is not a max heap." << endl;

   result = is_heap(v.begin(), v.end(), ignore_case);

   if (result == true)
      cout << "Given sequence is a max heap." << endl;
      
      return 0;
}

輸出:

Given sequence is not a max heap.
Given sequence is a max heap.

示例 4

讓我們看一個簡單的例子:

#include <iostream>     // std::cout
#include <algorithm>    // std::is_heap, std::make_heap, std::pop_heap
#include <vector>       // std::vector

using namespace std;

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

  if (!is_heap(foo.begin(),foo.end()))
    make_heap(foo.begin(),foo.end());

  cout << "Popping out elements:";
  while (!foo.empty()) {
    pop_heap(foo.begin(),foo.end());   // moves largest element to back
    cout << ' ' << foo.back();         // prints back
    foo.pop_back();                         // pops element out of container
  }
  cout << '\n';

  return 0;
}

輸出:

Popping out elements:9 8 7 6 5 4 3 2 1





相關用法


注:本文由純淨天空篩選整理自 C++ Algorithm is_heap()。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。