C++堆(push_heap;make_heap;pop_heap;sort_heap;is_heap;is_heap_until)

一、push_heap

头文件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分别添加和删除元素,则会保留其堆属性。

参数

  1. first,last
    随机访问迭代器到新堆范围的初始位置和最终位置,包括推送元素。 使用的范围是[first,last),它包含first和last之间的所有元素,包括first指向的元素,但不包括last指向的元素。
  2. comp
    二进制函数,接受范围中的两个元素作为参数,并返回可转换为bool的值。 返回的值指示作为第一个参数传递的元素是否被认为小于它定义的特定严格弱顺序中的第二个参数。
    除非[first,last]是空的或单元素堆,否则此参数应与用于构造堆的参数相同。
    该函数不得修改其任何参数。这可以是函数指针或函数对象。

返回值

没有

例外

如果任何元素比较,元素交换(或移动)或迭代器上的操作抛出,则抛出。请注意,无效参数会导致未定义的行为。

二、make_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来维护容器的堆属性。

参数

  1. first,last
    随机访问迭代器到要转换为堆的序列的初始和最终位置。使用的范围是[first,last),它包含first和last之间的所有元素,包括first指向的元素,但不包括last指向的元素。
    RandomAccessIterator应指向一个正确定义了swap的类型,它既可移动构造又可移动分配。
  2. comp
    二进制函数,接受范围中的两个元素作为参数,并返回可转换为bool的值。返回的值指示作为第一个参数传递的元素是否被认为小于它定义的特定严格弱顺序中的第二个参数。
    该函数不得修改其任何参数。这可以是函数指针或函数对象。

返回值

没有

三、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分别添加和删除元素,则会保留其堆属性。

参数

  1. first,last
    随机访问迭代器到堆的初始和最终位置要缩小一个。 使用的范围是[first,last),它包含first和last之间的所有元素,包括first指向的元素,但不包括last指向的元素。
    这不应该是空的范围。
  2. comp
    二进制函数,接受范围中的两个元素作为参数,并返回可转换为bool的值。 返回的值指示作为第一个参数传递的元素是否被认为小于它定义的特定严格弱顺序中的第二个参数。
    除非[first,last]是一个单元素堆,否则此参数应与用于构造堆的参数相同。
    该函数不得修改其任何参数。这可以是函数指针或函数对象。

返回值

没有

四、sort_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作为第二个版本,它应与用于构造堆的相同。

该范围作为堆丢失其属性。

参数

  1. first,last
    随机访问迭代器到要排序的堆范围的初始位置和最终位置。使用的范围是[first,last),它包含first和last之间的所有元素,包括first指向的元素,但不包括last指向的元素。
  2. comp
    二进制函数,接受范围中的两个元素作为参数,并返回可转换为bool的值。返回的值表示作为第一个参数传递的元素是否被认为是在它定义的特定严格弱顺序中的第二个参数之前。
    除非[first,last]是一个单元素堆,否则此参数应与用于构造堆的参数相同。
    该函数不得修改其任何参数。这可以是函数指针或函数对象。

返回值

没有

// 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

C++堆(push_heap;make_heap;pop_heap;sort_heap;is_heap;is_heap_until)_第1张图片

五、is_heap

头文件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作为第二个版本。

参数

  1. first,last
    RandomAccess迭代器到序列的初始和最终位置。检查的范围是[first,last),它包含first和last之间的所有元素,包括first指向的元素,但不包括last指向的元素。
  2. comp
    二进制函数,接受范围中的两个元素作为参数,并返回可转换为bool的值。返回的值表示作为第一个参数传递的元素是否被认为是在它定义的特定严格弱顺序中的第二个参数之前。
    该函数不得修改其任何参数。这可以是函数指针或函数对象。

返回值

如果范围[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;
}

在这里插入图片描述

六、is_heap_until

头文件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作为第二个版本。

参数

  1. first,last
    随机访问迭代器到序列中的初始和最终位置。检查的范围是[first,last),它包含first和last之间的所有元素,包括first指向的元素,但不包括last指向的元素。
  2. comp
    二进制函数,接受范围中的两个元素作为参数,并返回可转换为bool的值。返回的值表示作为第一个参数传递的元素是否被认为是在它定义的特定严格弱顺序中的第二个参数之前。
    该函数不得修改其任何参数。这可以是函数指针或函数对象。

返回值

范围中第一个元素的迭代器,该范围不是作为堆的范围的有效位置,或者如果所有元素都有效定位或者范围包含少于两个元素则为最后一个。

// 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;
}

大多数实现认为范围以相反的顺序排序为有效堆:
可能的输出:
在这里插入图片描述

你可能感兴趣的:(C++)