头文件algorithm
default (1)
template
void push_heap (RandomAccessIterator first, RandomAccessIterator last);
custom (2)
template
void push_heap (RandomAccessIterator first, RandomAccessIterator last,
Compare comp);
将元素推入堆范围
给定范围[first,last-1]中的堆,此函数通过将(last-1)中的值放入其中的相应位置,将堆的范围扩展为[first,last]。
可以通过调用make_heap将范围组织到堆中。 之后,如果使用push_heap和pop_heap分别添加和删除元素,则会保留其堆属性。
没有
如果任何元素比较,元素交换(或移动)或迭代器上的操作抛出,则抛出。请注意,无效参数会导致未定义的行为。
头文件algorithm
default (1)
template
void make_heap (RandomAccessIterator first, RandomAccessIterator last);
custom (2)
template
void make_heap (RandomAccessIterator first, RandomAccessIterator last,
Compare comp );
从范围创建堆
重新排列[first,last]范围内的元素,使它们形成堆。
堆是一种组织范围元素的方法,允许在任何时刻(使用pop_heap)快速检索具有最高值的元素,甚至重复,同时允许快速插入新元素(使用push_heap)。
具有最高值的元素始终首先指向。其他元素的顺序取决于特定的实现,但它在此标头的所有与堆相关的函数中是一致的。
使用operator <(对于第一个版本)或comp(对于第二个版本)比较元素:具有最高值的元素是与该范围中的每个其他元素相比将返回false的元素。
标准容器适配器priority_queue会自动调用make_heap,push_heap和pop_heap来维护容器的堆属性。
没有
头文件algorithm
default (1)
template
void pop_heap (RandomAccessIterator first, RandomAccessIterator last);
custom (2)
template
void pop_heap (RandomAccessIterator first, RandomAccessIterator last,
Compare comp);
来自堆范围的Pop元素
重新排列堆范围中的元素[first,last],使得被认为是堆的部分缩短为1:具有最高值的元素被移动到(last-1)。
虽然具有最高值的元素从第一个移动到(last-1)(现在已经不在堆中),但是其他元素的重组方式使得范围[first,last-1]保留了属性 一堆。
可以通过调用make_heap将范围组织到堆中。 之后,如果使用push_heap和pop_heap分别添加和删除元素,则会保留其堆属性。
没有
头文件algorithm
default (1)
template
void sort_heap (RandomAccessIterator first, RandomAccessIterator last);
custom (2)
template
void sort_heap (RandomAccessIterator first, RandomAccessIterator last,
Compare comp);
排序堆的元素
将堆范围中的元素[first,last]按升序排序。
使用operator <作为第一个版本比较元素,comp作为第二个版本,它应与用于构造堆的相同。
该范围作为堆丢失其属性。
没有
// range heap example
#include // std::cout
#include // std::make_heap, std::pop_heap, std::push_heap, std::sort_heap
#include // std::vector
int main () {
int myints[] = {10,20,30,5,15};
std::vector v(myints,myints+5);
std::make_heap (v.begin(),v.end());
std::cout << "initial max heap : " << v.front() << '\n';
std::pop_heap (v.begin(),v.end()); v.pop_back();
std::cout << "max heap after pop : " << v.front() << '\n';
v.push_back(99); std::push_heap (v.begin(),v.end());
std::cout << "max heap after push: " << v.front() << '\n';
std::sort_heap (v.begin(),v.end());
std::cout << "final sorted range :";
for (unsigned i=0; i
头文件algorithm
default (1)
template
bool is_heap (RandomAccessIterator first, RandomAccessIterator last);
custom (2)
template
bool is_heap (RandomAccessIterator first, RandomAccessIterator last,
Compare comp);
测试范围是否为堆
如果范围[first,last)形成堆,则返回true,就像使用make_heap构造一样。
使用operator <作为第一个版本比较元素,comp作为第二个版本。
如果范围[first,last)是一个堆(就像使用make_heap构造的那样),则返回true,否则返回false。如果范围[first,last]包含少于两个元素,则该函数始终返回true。
// is_heap example
#include // std::cout
#include // std::is_heap, std::make_heap, std::pop_heap
#include // std::vector
int main () {
std::vector foo {9,5,2,6,4,1,3,8,7};
if (!std::is_heap(foo.begin(),foo.end()))
std::make_heap(foo.begin(),foo.end());
std::cout << "Popping out elements:";
while (!foo.empty()) {
std::pop_heap(foo.begin(),foo.end()); // moves largest element to back
std::cout << ' ' << foo.back(); // prints back
foo.pop_back(); // pops element out of container
}
std::cout << '\n';
return 0;
}
头文件algorithm
default (1)
template
RandomAccessIterator is_heap_until (RandomAccessIterator first,
RandomAccessIterator last);
custom (2)
template
RandomAccessIterator is_heap_until (RandomAccessIterator first,
RandomAccessIterator last
Compare comp);
查找不按堆顺序排列的第一个元素
返回范围[first,last]中第一个元素的迭代器,如果范围被视为堆(如使用make_heap构造),则该迭代器不在有效位置。
返回的first和迭代器之间的范围是一个堆。
如果整个范围是有效堆,则该函数最后返回。
使用operator <作为第一个版本比较元素,comp作为第二个版本。
范围中第一个元素的迭代器,该范围不是作为堆的范围的有效位置,或者如果所有元素都有效定位或者范围包含少于两个元素则为最后一个。
// is_heap_until example
#include // std::cout
#include // std::is_heap_until, std::sort, std::reverse
#include // std::vector
int main () {
std::vector 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;
}