SGI

push_heap

类别:算法 组件类型:函数

原型

Push_heap名称为重载名;它实际上有两个push_heap函数。
template <class RandomAccessIterator>
void push_heap(RandomAccessIterator first, RandomAccessIterator last);

template <class RandomAccessIterator, class StrictWeakOrdering>
void push_heap(RandomAccessIterator first, RandomAccessIterator last,
               StrictWeakOrdering comp);

说明

Push_heap将元素添加到一个堆 [1] 中。假设[first, last - 1)已经是堆;要添加到堆中的元素是*(last - 1).

两个版本的push_heap它们定义如何判定一个元素是否小于另一个元素的方式不同。第一个版本使用operator<比较对象,而第二个版本使用 函数对象comp比较对象。第一个版本的先验条件是is_heap(first, last)true,第二个版本的先验条件是is_heap(first, last, comp)true.

定义

在标准头文件 algorithm 中和非标准的向后兼容头文件 algo.h 中进行定义。

类型需求

对于第一个版本对于第二个版本

前提条件

对于第一个版本对于第二个版本

复杂性

对数。最多log(last - first)次比较。

示例

int main()
{
  int A[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

  make_heap(A, A + 9);
  cout << "[A, A + 9)  = ";
  copy(A, A + 9, ostream_iterator<int>(cout, " "));
  
  push_heap(A, A + 10);
  cout << endl << "[A, A + 10) = ";
  copy(A, A + 10, ostream_iterator<int>(cout, " "));
  cout << endl;
}

输出是

[A, A + 9)  = 8 7 6 3 4 5 2 1 0 
[A, A + 10) = 9 8 6 3 7 5 2 1 0 4 

注释

[1] 堆是在 随机访问迭代器[f, l)范围内对元素进行排序的一种特定方式。堆非常有用(尤其是在排序中或作为优先级队列使用时)的原因在于,它们满足两个重要的特性。首先,*f是堆中最大的元素。其次,可以在对数时间内向堆中添加一个元素(使用push_heap),或从中删除*f它。内部而言,堆是用作顺序范围表示的一棵树。这棵树的构建方式使每个节点都小于或等于其父节点。

另请参阅

make_heap, pop_heap, sort_heap, is_heap, sort
[Silicon Surf] [STL Home]
版权所有 © 1999 Silicon Graphics, Inc.保留所有权利。 商标信息