STL中堆的应用

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<vector>
#include<cmath>
using namespace std;
int a[100];
bool cmp(int a,int b)
{
     return a>b;
}
int main()
{
//-------------------------------------------------
//建堆,make_heap(&first,&last) 范围:[first,last)。
    for (int i=0;i<=11;i++) scanf("%d",&a[i]);
    make_heap(&a[0],&a[12]); //大根堆
    for (int i=0;i<=11;i++) printf("%d ",a[i]); cout<<endl;
    make_heap(&a[0],&a[12],cmp); //小根堆
    for (int i=0;i<=11;i++) printf("%d ",a[i]); cout<<endl;
//-------------------------------------------------
//向堆中压入元素 push_heap(&first,&last),并调整堆。 范围:[first,last-1]。
    a[12]=22;
    push_heap(&a[0],&a[13],cmp); //小根堆。
    for (int i=0;i<=12;i++) printf("%d ",a[i]); cout<<endl;
//-------------------------------------------------
//弹出堆顶的元素(将其置于数组的末尾,堆的范围右边界-1) pop_heap(&first,&last)
//范围:[first,last-1]。
    pop_heap(&a[0],&a[13],cmp);
    for (int i=0;i<=12;i++) printf("%d ",a[i]); cout<<endl;
//-------------------------------------------------
//堆排序 sort_heap(&first,&last,cmp) 范围:[first,last)。
    sort_heap(&a[0],&a[12],cmp);
    for (int i=0;i<=11;i++) printf("%d ",a[i]); cout<<endl;
//-------------------------------------------------
    system("pause");
    return 0;
}

在网上看了很多,有的太乱,有的不实用,自己总结了一下。

时间: 2024-08-29 11:19:52

STL中堆的应用的相关文章

STL中的内存分配器原理

题记:内存管理一直是C/C++程序的红灯区.关于内存管理的话题,大致有两类侧重点,一类是内存的正确使用,例如C++中new和delete应该成对出现,用RAII技巧管理内存资源,auto_ptr等方面,很多C/C++书籍中都使用技巧的介绍.另一类是内存管理的实现,如linux内核的slab分配器,STL中的allocator实现,以及一些特定于某种对象的内存管理等.最近阅读了一些内存管理实现方面的资料和源码,整理了一下,汇编成一个系列介绍一些常用的内存管理策略. 1. STL容器简介 STL提供

C++11新特性应用--介绍几个新增的便利算法(stl中的heap使用,最大堆)

有的时候为了维护数据,我们使用stl的堆去维护一序列. 首先您要弄清楚堆和栈的区别,即heap和stack stl中的堆默认是最大堆. 先介绍 push_heap,pop_heap,make_heap,sort_heap这四个算法,这四个不是C++11新增加的内容. 首先是如何产生一个最大推: make_heap 原型: template <class RandomAccessIterator> void make_heap (RandomAccessIterator first, Rando

一步一步认识C++STL中的迭代器

一步一步认识C++STL中的迭代器 "指针"对所有C/C++的程序员来说,一点都不陌生.在接触到C语言中的malloc函数和C++中的new函数后,我们也知道这两个函数返回的都是一个指针,该指针指向我们所申请的一个"堆".提到"堆",就不得不想到"栈",从C/C++程序设计的角度思考,"堆"和"栈"最大的区别是"栈"由系统自动分配并且自动回收,而"堆&quo

STL之堆操作

首先来看完全二叉树的定义: 若设二叉树的深度为h,除第 h 层外,其它各层 (1-h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树.而将一维数组视为完全二叉树书得到的即为堆. 堆效率极高,像十分常用的排序算法.Dijkstra算法.Prim算法等都要用堆才能优化,几乎每次都要考到的二叉排序树的效率也要借助平衡性来提高,而平衡性基于完全二叉树. STL中与堆相关的4个函数--建立堆make_heap(),在堆中添加数据push_heap(),在堆中删除数据

STL中的所有算法(70个)

 STL中的所有算法(70个) STL算法部分主要由头文件<algorithm>,<numeric>,<functional>组成.要使用 STL中的算法函数必须包含头文件<algorithm>,对于数值算法须包含<numeric>,<functional>中则定义了一些模板类,用来声明函数对象. STL中算法大致分为四类: 1.非可变序列算法:指不直接修改其所操作的容器内容的算法. 2.可变序列算法:指可以修改它们所操作的容器内

STL 中make_heap学习

STL中make_heap 的接口为: default (1) template <class RandomAccessIterator> void make_heap (RandomAccessIterator first, RandomAccessIterator last); custom (2) template <class RandomAccessIterator, class Compare> void make_heap (RandomAccessIterator

关于内存中堆和栈的知识和应用的总结

以前做的一个小项目最近经常不稳定,查了下日志大部分都是因为缓冲溢出而导致程序报错,于是乎在网上查找了一些关于内存使用的内容,收获颇丰.在此将前人的一些精华总结收录于此,加深印象.有不对或不足的地方请大家予以指正. 文章链接:http://blog.csdn.net/szchtx/article/details/7981401 http://www.cppblog.com/oosky/archive/2006/01/21/2958.html http://www.cnblogs.com/lln77

STL中sort、priority_queue、map、set的自定义比较函数

STL中,sort的默认排序为less,也就是说从小到大排序:priority_queue默认是less,也就说大顶堆:map默认是less,也就说用迭代器迭代的时候默认是小的排在前面:set默认是less,也就是说用迭代器迭代的时候是从小到大排序的. 1.sort #include <stdio.h> #include <algorithm> #include <functional> using namespace std; bool comp(const int&

STL中的优先级队列priority_queue

priority_queue(queue类似)完全以底部容器为根据,再加上二叉堆(大根堆或者小根堆)的实现原理,所以其实现非常简单,缺省情况下priority_queue以vector作为底部容器.另外priority_queue缺省比较规则是less: class Compare = less<typename Sequence::value_type> less对应的是按照大根堆来实现优先级队列,当然也可以将比较规则设置为greater,这时候是按照小根堆来实现的优先级队列. priori