C++ STL 如何调堆【两种方法】 看了就懂

C++ STL 堆的调取


记住掉STL里的东西要在前面加上use namespace std;

1.优先队列

这个堆我想应该是最常用的,因为写起来方便,但是时间效率上不高,往往比手写的多一个系数。所以本人不是很喜欢用。
需要用到algorithm这个库。

定义:
priority_queue<存储类型> 变量名称,例如priority_queue< int > hep;
注意了,这是大根堆,也就是堆顶是最大的。
如果要调小根堆,那么就需要多一个库queue,然后定义的时候需要这么写:
priority_queue< int,vector< int >,greator< int > >
PS:greator< int >后一定要加空格,否则C++就会认为是>>。

如果你要掉多关键字,那么你需要重载运算符。而且你不能直接查看堆中的元素,只能知道堆顶的元素。

运用:
hep为例:
hep.size():返回堆内元素个数。
hep.empty():如果堆为空,返回真,否则返回假。
hep.top():返回堆顶元素。
hep.pop():删除堆顶元素,自动整理。
hep.push(int x):插入一个元素,自动整理。

其实也就这么多,但是注意这个堆是很慢的,在数据大的时候最好不用。

2.(我也不知道怎么叫)

这种方法速度很快,接近手写的堆,我也一直这么写,虽然稍微麻烦点,但是也麻烦不到哪里去。只需用到algorithm这个库。

定义: 类型 名称;例如 int hep[];就是定义一个数组就行了。
我们需要写两个函数。

void put(int x){
    hep[++len]=x;//len表示堆中元素个数
    push_heap(hep+1,hep+1+len);//就像排序一样
}
int get(){
    pop_heap(hep+1,hep+1+len);
    //这个函数会将堆顶放到堆尾,所以后面是hep[len--];
    return hep[len--];
}

其实就是排序一样的格式,注意这里也是大根堆,如果要小根堆,就讲堆中元素取反,然后取出时再取反就可以了,当然可以写cmp,或重载运算符。

posted @ 2018-03-01 19:25  XSamsara  阅读(430)  评论(0编辑  收藏  举报