C++ STL堆操作

/* STL 最大堆、最小堆的应用 */
#include <iostream>
#include <vector>
#include <algorithm>    //

using namespace std;

/*
STL 堆操作
(1)make_heap()构造堆
void make_heap(first_pointer,end_pointer,compare_function);
默认比较函数是(<),即最大堆。
函数的作用是将[begin,end)内的元素处理成堆的结构

(2)push_heap()添加元素到堆
void push_heap(first_pointer,end_pointer,compare_function);
新添加一个元素在末尾,然后重新调整堆序。该算法必须是在一个已经满足堆序的条件下。
先在vector的末尾添加元素,再调用push_heap

(3)pop_heap()从堆中移出元素
void pop_heap(first_pointer,end_pointer,compare_function);
把堆顶元素取出来,放到了数组或者是vector的末尾。
要取走,则可以使用底部容器(vector)提供的pop_back()函数。
先调用pop_heap再从vector中pop_back元素

(4)sort_heap()对整个堆排序
排序之后的元素就不再是一个合法的堆了。
*/

//最大堆
struct MaxHeapCmp
{
    inline bool operator()(const int &x,const int &y)
    {
        return x < y;
    }
};

//最小堆
struct MinHeapCmp
{
    inline bool operator()(const int &x, const int &y)
    {
        return x > y;
    }
};

void test()
{
    std::vector<int> data{ 3,1,7,4,99,75,34,10 };

    //堆排序
    std::make_heap(data.begin(), data.end(), MinHeapCmp());
    for (int n : data)
    {
        cout << n << endl;
    }

    printf("------------------\n");

    //添加元素
    data.push_back(111);
    //再次堆排序
    std::push_heap(data.begin(), data.end(), MaxHeapCmp());
    for (int n : data)
    {
        cout << n << endl;
    }
}

int main()
{
    test();
    printf("-ok-\n");
    getchar();

    return 0;
}

原文地址:https://www.cnblogs.com/zhanggaofeng/p/10657165.html

时间: 2024-10-11 06:20:33

C++ STL堆操作的相关文章

64 - 数据流中的中位数 || STL 堆

题目: 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值. 思路解析 数据是从数据流读出,因此数组的个数是再逐渐的增加.如何选用一个容器,能够存储数据,并能够给出中位数. 无序数组:插入O(1) partation操作找出中位数 O(n) 有序数组:插入O(n) 找出中位数O(1) 有序链表:插入O(n) 找出中位数O(1) 搜索二叉树:插入O(logn)~O(

用堆操作不断加入点来找到每个点对应所包含的值的个数的理解

首先还是要清楚一下堆操作的代码,毕竟线段树打多了,打堆的时候总会往线段树方向靠近 首先是建堆: D=1;for(;D<maxn+2;D<<=1); 然后给堆赋予值就可以了 查找区间段的和:int query(int s,int t){    int i=D+s-1,j=D+t+1,ans=0;    for(;i^j^1;i>>=1,j>>=1){        if(~i&1) ans+=sum[i^1];        if(j&1) ans+

STL 常见操作

stl的操作不是很熟练, 记录一下 1.vector: 排序: sort(vc.begin(),vc.end()); 去重: sort(vc.begin(),vc.end()); num.erase(unique(vc.begin(),vc.end()),vc.end());

STL之堆操作

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

STL 堆的使用

本来是要写leetcode上的merge k sorted lists那道题目,这个题目我还是很熟悉的,毕竟是看过算法导论的人,但是写的过程中对堆的维护代码还是挺多的,所以我想到了STL中的堆.下面就来学习一下这个STL. 先介绍一个非常好的学习C++的网站 http://www.cplusplus.com/ 这个网站对C++的理解还是很好的,个人觉得比msdn要好不知道哪里去了. 对堆的操纵主要有以下四个: make_heap, pop_heap, push_heap, sort_heap 他

STL具体操作之next_permutation和prev_permutation函数

 next函数默认的是从小到大的顺序,pre函数默认的是从大到小的顺序: {3,1,2}用next得到的结果是{3,1,2}和{3,2,1}: 用pre得到的结果是{3,1,2},{2,3,1},{2,1,3},{1,3,2,},{1,2,3}: 原理如下: [STL]next_permutation的原理和使用 1.碰到next_permutation(permutation:序列的意思) 今天在TC上碰到一道简单题(SRM531 - Division Two - Level One),是

STL具体操作之优先队列

 STL容器之优先队列 优先级队列,以前刷题的时候用的比较熟,现在竟然我只能记得它的关键字是priority_queue(太伤了).在一些定义了权重的地方这个数据结构是很有用的. 先回顾队列的定义:队列(queue)维护了一组对象,进入队列的对象被放置在尾部,下一个被取出的元素则取自队列的首部.priority_queue特别之处在于,允许用户为队列中存储的元素设置优先级.这种队列不是直接将新元素放置在队列尾部,而是放在比它优先级低的元素前面.标准库默认使用<操作符来确定对象之间的优先级关系

STL 堆

洛谷P3378 [模板]堆 #include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; typedef long long ll; const int N=1e6+5; inline int read(){ char c=getchar();int x=0,f=1; while(c<'0'||c>'9'){if

【转载】 C++ stl string 操作

总结一下C++中string的操作,来自〈C++ Primer〉第四版. 1. string对象的定义和初始化: 12345678910111213 string s1; //空串string s2(s1); //将s2初始化为s1的一个副本string s3("value"); //s3初始化并赋值string s4(n,"c"); //s4初始化,赋值为n个'c'string s5(b,e); //初始化s5为迭代器b,e范围内的副本string s6(cp);