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()用法及代碼示例
- C++ Algorithm is_sorted()用法及代碼示例
- C++ Algorithm is_partitioned()用法及代碼示例
- C++ Algorithm is_sorted_until()用法及代碼示例
- C++ Algorithm inplace_merge()用法及代碼示例
- C++ Algorithm iter_swap()用法及代碼示例
- C++ Algorithm includes()用法及代碼示例
- C++ Algorithm remove_if()用法及代碼示例
- C++ Algorithm remove()用法及代碼示例
- C++ Algorithm max_element()用法及代碼示例
- C++ Algorithm set_union()用法及代碼示例
- C++ Algorithm next_permutation()用法及代碼示例
- C++ Algorithm upper_bound()用法及代碼示例
- C++ Algorithm minmax()用法及代碼示例
- C++ Algorithm remove_copy_if()用法及代碼示例
- C++ Algorithm random_shuffle()用法及代碼示例
- C++ Algorithm pop_heap()用法及代碼示例
- C++ Algorithm replace()用法及代碼示例
- C++ Algorithm set_intersection()用法及代碼示例
- C++ Algorithm lower_bound()用法及代碼示例
注:本文由純淨天空篩選整理自 C++ Algorithm is_heap_until()。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。