感觉c++最有用的stl是bitset、堆(优先队列)和平衡树,其他的都可以手打

这里主要讲一下堆和平衡树的基本用法和区别所在

priority_queue

堆/优先队列

定义:

priority_queue<类型>
priority_queue<int> 大根堆
priority_queue<int,vector<int>,less<int> > 大根堆
priority_queue<int,vector<int>,greater<int> > 小根堆
priority_queue<结构体>

基本函数:

push(x):加入一个元素,可以是数or结构体

pop():弹出堆顶

top():堆顶的元素

size():堆的大小

empty():是否为空(空即为1)

关于结构体的比较:


struct type{
int x,y;
bool friend operator < (type a,type b) {return a.x<b.x;}
//反正这样写就对了
};

结构体的赋值可以为{a,b,...}或 名称{a,b,...}

multiset

与set的不同在于multiset可以有重复元素,所以一般都用multiset

定义:

multiset<类型>
multiset<int> 从小到大
multiset<int,less<int> > 从小到大
multiset<int,greater<int> > 从大到小
multiset<结构体>

迭代器:

multiset<定义和对应的set一致> ::iterator

作用是遍历set/特别指向某一个元素

基本函数:

insert(x):加入一个元素,可以是数/结构体

erase(x):

有两种情况

①x是数/结构体

那么会把所有的x删掉

②x是某一个迭代器

那么只会删掉迭代器对应的元素

begin():返回关键值最小的元素指针

(指针x对应的值为*x,如果是结构体则为(*x).a)

end():返回关键值最大的元素指针的后一位(最大的是--end())

size()、empty():同优先队列

lower_bound(x):第一个大于等于x的元素指针

upper_bound(x):第一个大于x的元素指针

小于等于=大于 的前一位,小于=大于等于 的前一位

e.insert(1);e.insert(2);e.insert(3);e.insert(4);e.insert(5);
cout<<*e.lower_bound(3)<<" "<<*e.upper_bound(3)<<endl; //>= >
cout<<*--e.lower_bound(3)<<" "<<*--e.upper_bound(3)<<endl; //< <=
//3 4
//2 3

遍历:

可以通过迭代器的移动来遍历

(头为begin(),尾为--end(),最大能走到end())


e.insert(1);e.insert(2);e.insert(3); I=e.begin();
while (I!=e.end())
cout<<*I<<" ",*++I;
cout<<endl; //1 2 3

区别

multiset可以遍历/找前驱后继/删除

*重点:priority_queue的比较机制和set/sort相反

#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <queue>
#include <set>
#define fo(a,b,c) for (a=b; a<=c; a++)
#define fd(a,b,c) for (a=b; a>=c; a--)
using namespace std; struct type{
int x,y;
bool friend operator < (type a,type b) {return a.x<b.x;}
}; multiset<type> a;
priority_queue<type> b;
type c[3]; int main()
{
a.insert({3,3});a.insert({2,2});a.insert({1,1});
b.push({1,1});b.push({2,2});b.push({3,3});
c[0]={3,3};c[1]={2,2};c[2]={1,1};
sort(c,c+3); cout<<(*a.begin()).x<<" "<<b.top().x<<" "<<c[0].x<<endl;
//1 3 1
}

可以发现,优先队列得到的结果和multiset/sort刚好相反

实际上,multiset/sort最终的状态满足a1<a2<a3...<an(<可以是定义的运算)

而priority_queue应该是当一个元素x满足fa[x]<x时交换,实质上维护的是大根堆

一种记忆方法:"优先"队列=先大后小

priority_queue与multiset的更多相关文章

  1. POJ 2431 Expedition (priority_queue或者multiset可解)

    Expedition Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 18655   Accepted: 5405 Descr ...

  2. [CareerCup] 11.8 The Rank of Number 数的排行

    11.8 Imagine you are reading in a stream of integers. Periodically, you wish to be able to look up t ...

  3. CSP-S 2019提高组训练 服务器需求

    时间限制:C/C++ 3秒 空间限制:C/C++ 262144K 题目描述 小多计划在接下来的n天里租用一些服务器,所有的服务器都是相同的.接下来n天中,第i天需要\(a_i\)台服务器工作,每台服务 ...

  4. STL容器(Stack, Queue, List, Vector, Deque, Priority_Queue, Map, Pair, Set, Multiset, Multimap)

    一.Stack(栈) 这个没啥好说的,就是后进先出的一个容器. 基本操作有: stack<int>q; q.push(); //入栈 q.pop(); //出栈 q.top(); //返回 ...

  5. HDU 4006 The kth great number(multiset(或者)优先队列)

    题目 询问第K大的数 //这是我最初的想法,用multiset,AC了——好吧,也许是数据弱也有可能 //multiset运用——不去重,边插入边排序 //iterator的运用,插入的时候,如果是相 ...

  6. STL 整理(map、set、vector、list、stack、queue、deque、priority_queue)(转)

    向量(vector) <vector> 连续存储的元素<vector> Vector<int>c; c.back()    传回最后一个数据,不检查这个数据是否存在 ...

  7. nyoj 55 懒省事的小明 优先队列 multiset 还有暴力

    懒省事的小明 时间限制: 3000 ms  |  内存限制: 65535 KB 难度: 3   描述       小明很想吃果子,正好果园果子熟了.在果园里,小明已经将所有的果子打了下来,而且按果子的 ...

  8. multimap 和priority_queue详解

    上一期是关于STL和并查集结合的例题,也附了STL中部分容器的使用摘要,由于是从网上东拼西凑的,感觉有的关键点还是没解释清楚,现在从其中摘出两个容器,用例题对它们的用法进行进一步解释. 以下是例题的介 ...

  9. HDU 4268 multiset

    http://acm.hust.edu.cn/vjudge/contest/123100#problem/B #include <iostream> #include <string ...

随机推荐

  1. Java多线程ThreadLocal介绍

    在Java多线程环境下ThreadLocal就像一家银行,每个线程就是银行里面的一个客户,每个客户独有一个保险箱来存放金钱,客户之间的金钱不影响. private static ThreadLocal ...

  2. 简述Js中,判断对象为空对象的几种方式

    1.空对象.空引用以及undefined三种概念的区别 空对象:是对象,但它的值是指向没有任何属性的对象的引用, {}是指 不含任何属性 的对象,当然对象属性包括 字面值和函数: 空引用:obj=nu ...

  3. 虚拟机 编辑器 vi使用方法详细介绍

    vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令.由于对Unix及Linux系统的任何版本,vi编辑器是完全相 ...

  4. No repository found containing: …错误解决

    由于我安装的是Eclipse ForJava Development,无JAVA EE,查找资料后发现可以自己在已有软件的基础上配置,总结如下: >>>>>点开之后,找到 ...

  5. 【转帖】Linux系统上面qemu 模拟arm

    零基础在Linux系统搭建Qemu模拟arm https://blog.csdn.net/weixin_42489042/article/details/81145038 自己没搞定 改天再试试 感谢 ...

  6. 弹出ifream

      top.$.jBox("iframe:"+'${ctx}/synopsis/hmlwxSynopsis/addItem', {title: "添加作品",w ...

  7. google浏览器切换成中文

    新浪下载地址:http://down.tech.sina.com.cn/content/40975.html 默认字体好像是西班牙语 1.浏览器地址chrome://settings/language ...

  8. .net几种timer区别

    概述:.net框架不同名称控件都包含了各种timer,但每个timer有什么具体区别呢? 一.System.Threading private static void ThreadingTimer() ...

  9. java线程中的同步锁和互斥锁有什么区别?

    两者都包括对资源的独占. 区别是 1:互斥是通过竞争对资源的独占使用,彼此没有什么关系,也没有固定的执行顺序. 2:同步是线程通过一定的逻辑顺序占有资源,有一定的合作关系去完成任务.

  10. host - 使用域名服务器查询主机名字

    SYNOPSIS (总览) host [-l ] [-v ] [-w ] [-r ] [-d ] [-t querytype ] [-a ] host [server ] DESCRIPTION (描 ...