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


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


C++ 算法 is_heap_until() 函數用於返回一個迭代器,該迭代器指向範圍 [first, last) 中第一個不滿足堆排序條件的元素,或者如果範圍形成一個堆則結束。

使用運算符比較元素

用法

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

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

參數

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

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

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

返回值

它返回一個迭代器,該迭代器指向範圍 [first, last) 中不滿足堆排序條件的第一個元素,或者如果範圍形成一個堆則結束。

複雜度

複雜性在第一個和最後一個之間的距離上是線性的:比較元素直到發現不匹配。

數據競爭

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

異常

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

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

例子1

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

#include <iostream>     // std::cout
#include <algorithm>    // std::is_heap_until, std::sort, std::reverse
#include <vector>       // std::vector

using namespace std;

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

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

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

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

  return 0;
}

輸出:

The 9 first elements are a valid heap:9 8 7 6 5 4 3 2 1

例子2

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

#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_until(v.begin(), v.end()) == v.end()) << endl;

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

輸出:

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

例子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'};
   auto result = is_heap_until(v.begin(), v.end());

   cout << char(*result) << " is the first element which "
        << "does not satisfy the max heap condition." << endl;

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

   if (result == end(v))
      cout << "Entire range is a valid heap." << endl;

   return 0;
}

輸出:

d is the first element which does not satisfy the max heap condition.
Entire range is a valid heap.

示例 4

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

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

#include<iostream> 
#include<algorithm> // for heap operations 
using namespace std; 
int main() 
{ 
      
    // Initializing a vector 
    vector<int> v1 = {40, 30, 25, 35, 15}; 
      
    // Declaring heap iterator 
    vector<int>::iterator it1; 
      
    // Checking if container is heap 
    // using is_heap() 
    is_heap(v1.begin(), v1.end())? 
    cout << "The container is heap ":
    cout << "The container is not heap"; 
    cout << endl; 
      
    // using is_heap_until() to check position  
    // till which container is heap 
    auto it = is_heap_until(v1.begin(), v1.end()); 
    
    // Displaying heap range elements 
    cout << "The heap elements in container are:"; 
    for (it1=v1.begin(); it1!=it; it1++) 
       cout << *it1 << " "; 
     
    return 0; 
}

輸出:

The container is not heap
The heap elements in container are:40 30 25





相關用法


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