STL中的heap操作

C ++  STL 中与heap 有关的操作有 如下几个 :

make_heap(), 

pop_heap(),

push_heap(), 

sort_heap(),  

is_heap(); 

 

is_heap() :

 注:visual studio的STL实现中没有该函数。

原型如下 :

1. bool is_heap(iterator start, iterator end); 

   ->判断迭代器[start, end] 区间类的元素是否构成一个堆.  是返回true ,否则返回 false.

2. bool is_heap(iterator start, iterator end, StrictWeakOrdering cmp); 

    ->判断迭代器[start, end] 区间类的元素在cmp条件下是否构成一个堆. 是返回true ,否则返回 false.

 

make_heap() :

 

 原型如下 :

1. void make_heap( random_access_iterator start, random_access_iterator end );

 

2.

void make_heap( random_access_iterator start, random_access_iterator end, StrictWeakOrdering cmp ); 

  ->以 迭代器[start , end] 区间内的元素生成一个堆. 默认使用 元素类型 的 < 操作符 进行判断堆的类型, 因此生成的是大顶堆 .

->当使用了 版本2时, 系统使用 用户定义的 cmp 函数来构建一个堆 

  ->值得注意的是,  make_heap 改变了 迭代器所指向的 容器 的值.

 

 pop_heap() :

 

 原型如下 :

1.  void pop_heap( random_access_iterator start, random_access_iterator end );

2.  void pop_heap( random_access_iterator start, random_access_iterator end, StrictWeakOrdering cmp );

   ->pop_heap() 并不是真的把最大(最小)的元素从堆中弹出来. 而是重新排序堆. 它首元素末元素交换,然后将[first,last-1)的数据再做成一个堆。 

     此时, 原来的 首元素 位于迭代器 end-1 的位置,  它已不再属于堆的一员!  

   ->如果使用了 版本2 , 在交换了 首元素末元素后 ,使用 cmp 规则 重新构建一个堆.

 

 push_heap() :

原型如下 :

1.   void push_heap( random_access_iterator start, random_access_iterator end );

  2.   void push_heap( random_access_iterator start, random_access_iterator end, StrictWeakOrdering cmp ); 

    -> 算法假设迭代器区间[start, end-1)内的元素已经是一个有效堆, 然后把 end-1 迭代器所指元素加入堆. 

    -> 如果使用了 cmp 参数, 将使用 cmp 规则构建堆.

 

sort_heap() : 

 

原型如下 :

  1. void sort_heap (random_access_iterator start, random_access_iterator end);

2. void sort_heap (random_access_iterator start, random_access_iterator end, StrictWeakOrdering cmp); 

  -> 堆结构被完全破坏, 相当于对元素进行排序, 效果和排序算法类似.  

-> 如果使用了 cmp 参数, 将使用 cmp 规则排序堆.

#include <iostream>
#include <algorithm>
#include <vector>
#include <functional>
using namespace std;
int main()
{
   const int vectorsize=8;
   typedef vector<int> IntVector;
   typedef IntVector::iterator IntVectorIt;
   IntVector Numbers(vectorsize);
   IntVectorIt it;
   Numbers[0]=4;
   Numbers[1]=10;
   Numbers[2]=70;
   Numbers[3]=10;
   Numbers[4]=30;
   Numbers[5]=69;
   Numbers[6]=96;
   Numbers[7]=100;
   for(it = Numbers.begin(); it != Numbers.end(); it++)        
    cout << *it<<" ";   //4 10 70 10 30 69 96 100
   cout<<endl;
   make_heap(Numbers.begin(), Numbers.end()) ;   
   cout << "After calling make_heap\n" << endl ;    
     for(it = Numbers.begin(); it != Numbers.end(); it++)   
   cout << *it << " " ;  // 100 30 96 10 4 69 70 10
  cout<< endl ;
 // sort_heap(Numbers.begin(), Numbers.end()) ;  
 // cout << "After calling sort_heap\n" << endl ;   
 // for(it = Numbers.begin(); it != Numbers.end(); it++)      
 //  cout << *it << " " ;    
 // cout << endl ;
  make_heap(Numbers.begin(), Numbers.end()) ;  //一定要调用,因为排序后堆的结构已经被破坏
  Numbers.push_back(7) ;
     push_heap(Numbers.begin(), Numbers.end()) ;
      make_heap(Numbers.begin(), Numbers.end()) ; 
  cout << "After calling push_heap and make_heap\n" << endl ; 
  for(it = Numbers.begin(); it != Numbers.end(); it++)      
   cout << *it << " " ;     cout << endl ;    //100 30 96 10 4 69 70 10 7
  pop_heap(Numbers.begin(), Numbers.end()) ;  
  cout << "After calling pop_heap\n" << endl ;    
  for(it = Numbers.begin(); it != Numbers.end(); it++)     
   cout << *it << " " ;     cout << endl ; //96 30 70 10 4 69 7 10 100

}

把这几句加上

 sort_heap(Numbers.begin(), Numbers.end()) ;  
  cout << "After calling sort_heap\n" << endl ;   
  for(it = Numbers.begin(); it != Numbers.end(); it++)      
   cout << *it << " " ;  

 

//4 10 70 10 30 69 96 100

// 100 30 96 10 4 69 70 10
//4 10 10 30 69 70 96 100

//100 69 96 30 4 70 10 10 7

//96 69 70 30 4 7 10 10 100
若利用STL中的堆函数来实现堆排序,则代码十分简洁。以下是代码

#include <iostream>
#include <algorithm>
#include <vector>
#include <functional>
using namespace std;
int main()
{
   const int vectorsize=8;
   typedef vector<int> IntVector;
   typedef IntVector::iterator IntVectorIt;
   IntVector Numbers(vectorsize);
   IntVectorIt it;
   Numbers[0]=4;
   Numbers[1]=10;
   Numbers[2]=70;
   Numbers[3]=10;
   Numbers[4]=30;
   Numbers[5]=69;
   Numbers[6]=96;
   Numbers[7]=100;
   for(it = Numbers.begin(); it != Numbers.end(); it++)        
    cout << *it<<" ";
   cout<<endl;
   make_heap(Numbers.begin(), Numbers.end()) ;   
   cout << "After calling make_heap\n" << endl ;    
     for(it = Numbers.begin(); it != Numbers.end(); it++)   
   cout << *it << " " ; 
  cout<< endl ;

for(it = Numbers.end(); it!=Numbers.begin(); it--)
   pop_heap(Numbers.begin(), it);
           cout << "after 堆排序:\n";
        for(it = Numbers.begin(); it != Numbers.end(); it++)
   cout << *it << " " ;

// 100 30 96 10 4 69 70 10
//4 10 10 30 69 70 96 100

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值