【C++】队列优先队列详解——deque.queue.priority_queue
deque
可以队首和队尾插入,也可以队首和队尾弹出
支持随机访问,即可以直接用下标来访问元素。它和vector有点像,因为它可以index索引和at()函数索引,当然,也可以迭代器索引。
此外,它可以进行指定尺寸的构造,queue就不可以指定尺寸构造。
构造函数
deque<int> q1;
deque<int> q2(6,8);//6个值为8的成员
deque<int> q3(q2.begin() + 2, q2.end());
deque<int> q4(q2);
迭代器
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AuIBjgSo-1669195255380)(C:/Users/l/AppData/Roaming/Typora/typora-user-images/image-20221123160955743.png)]
常用操作
操作明显多于queue和pq
empty(); //判断容器是否为空
clear(); //清空容器的所有数据
size(); //返回容器中的元素的个数
resize(num); //重新指定容器的长度为num,若容器变长,则以默认值填充新位置。//如果容器变短,则末尾超出容器长度的元素被删除。
resize(num,elem); //重新指定容器的长度为num,若容器变长,则以elem值填充新位置。如果容器变短,则超出容器长度的元素被删除。
clear(); //清空容器的所有数据
swap();
访问操作
at(int idx); //返回索引idx所指的数据
operator[]; //返回索引idx所指的数据
front(); //返回容器中第一个数据元素
back(); //返回容器中最后一个数据元素
插入删除覆盖
deque<int>::iterator it = bar.begin();
push_back(elem); //在容器尾部添加一个数据
push_front(elem); //在容器头部插入一个数据
pop_back(); //删除容器最后一个数据
pop_front(); //删除容器第一个数据insert(pos,elem); //在pos位置插入一个elem元素的拷贝,返回新数据的位置。
insert(pos,n,elem); //在pos位置插入n个elem数据,无返回值
insert(pos,beg,end); //在pos位置插入[beg,end)区间的数据,无返回值erase(beg,end); //删除[beg,end)区间的数据,返回下一个数据的位置。
erase(pos); //删除pos位置的数据,返回下一个数据的位置。assign(beg, end); //将[beg,end)区间中的数据拷贝赋值给本身。
assign(n,elem); //将n个elem拷贝赋值给本身。
关于push和emplace的区别
https://blog.csdn.net/jokerMingge/article/details/119736247
C++11
emplace()
emplace_back()
emplace_front()
emplace_cbegin
emplace_crbegin
emplace_cend
emplace_crend ;
shrink_to_fit(); //请求容器减少内存使用以适应其大小。
与其他container的区别
头插
vector对于头部的插入效率低,数据量越大,效率越低,例如头部后有十万个数据,则往头部插入一个数据时,十万个数据都需要往后挪一挪才能在头部插入数据。deque相对而言,对头部的插入删除速度会比vector快。deque在头部和尾部进行数据插入和删除操作更加高效。
如果没有频繁在头部或尾部进行插入和删除操作,deque比list和forward_list的性能更差。
访问
vector访问元素时的速度会比deque快。
存储
与vector不同的是,deque不能保证所有的元素存储在连续的空间中,在deque中通过指针加量方式访问元素可能会导致非法的操作。
vector使用使用动态数组,该数组通常需要动态增长;deque中的元素可能分散在不同的存储块中,在deque中保存一些必要的信息,通常用来在常数范围内直接访问deque中的任何一个元素,所以deque的内部实现比vector复杂,但是这些额外信息使得dque在某些情况下增长更加的高效,特别是在序列比较大,重新分配成本比较高的情况下。
内部工作原理
和 vector 容器采用连续的线性空间不同,deque 容器存储数据的空间是由一段一段等长的连续空间构成,各段空间之间并不一定是连续的,可以位于在内存的不同区域。为了管理这些连续空间,deque 容器用数组存储着各个连续空间的首地址。也就是说,数组中存储的都是指针,指向那些真正用来存储数据的各个连续空间。
通过建立数组,deque 容器申请的这些分段的连续空间就能实现“整体连续”的效果。换句话说,当 deque 容器需要在头部或尾部增加存储空间时,它会申请一段新的连续空间,同时在数组的开头或结尾添加指向该空间的指针,由此该空间就串接到了 deque的头部或尾部。
priority_queue
优先队列是一种会按照默认或自定义的优先级进行自动排序的队列,其特点是优先级高的元素排在队首,低的排在队尾。
创建
数据类型:可以是int、double等基本类型,也可以是自定义的结构体。
容器类型:一般为deque(双端列表)、vector(向量容器),可省略,省略时以vector为默认容器。
pq:优先队列名。
priority_queue< 数据类型,容器类型,优先规则> pq;
priority_queue<int> pq;
priority_queue<int,vector<int>,less<int> > pq; //以less为排列规则(大顶堆,表示顶堆元素比其他都大)
priority_queue<int,vector<int>,greater<int> > pq; //以greater为排列规则(小顶堆,表示顶堆元素比其他都小)
常用操作
pq.push(); //入队
pq.pop(); //出队
pq.size() //返回当前对中元素个数
pq.top(); //优先队列 取队首元素
pq.empty(); //判断是否为空(空返回 1,非空返回 0)
C++11
pq.swap()
pq.emplace()
与queue的区别在于queue有front()和back(),而pq只有top()
queue
(58条消息) C++队列queue用法详解_KEPROM的博客-CSDN博客_c++ queue
一般直接用deque。deque的功能比queue更全,而且queue底层也是用deque创建的
创建
queue<数据类型,容器类型> q;
数据类型:可以是int、double等基本类型,也可以是自定义的结构体。
容器类型:一般为deque或者list(双向链表),可省略,省略时以deque为默认容器。
queue<int> q; //使用默认的双端队列为底层容器创建一个空的queue队列对象q,数据元素为int类型。
queue<int,list<int>> q1;
queue<int,list<int>> q2(q1);
/*复制构造函数(queue(const queue&)),用一个queue对象创建新的queue对象。
利用queue对象q1,创建一个以双向链表为底层容器的queue对象q2*/
- 和 stack 一样,queue 也没有迭代器。访问元素的唯一方式是遍历容器内容,并移除访问过的每一个元素。
- 只能队尾插入,队首弹出。
- queue不初始化元素个数或者初始化值
常用操作
q.push(x); //入队,将元素 x 从队尾插入(尾插法)
q.pop(); //出队,删除对首元素,并返回其值
q.size(); //返回队中元素个数
q.front(); //返回队首元素
q.back(); //返回队尾元素
q.empty(); //判断是否为空(空返回 1,非空返回 0)
C++11
q.swap(q2)
q.emplace(x) //入队
empty()函数可以判断队列是否为空,但没有clear来清空,可以创建空的queue用swap函数交换
queue q2;
if (q1.empty()) {cout << “q1 is empty” << endl;
}
q1.swap(q2);
if (q1.empty()) {cout << “q1 is empty after swap” << endl;
}
【C++】队列优先队列详解——deque.queue.priority_queue相关推荐
- 单调队列-原理详解(deque实现)
一.单调队列的概念: 单调队列,即单调递减或单调递增的队列. 二.单调队列的性质: 1. 队列中的元素在原来的列表中的位置是由前往后的(随着循环顺序入队). 2. 队列中元素的大小是单调递增或递减 ...
- ucos 消息队列代码详解_用python实现 多进程队的列数据处理详解,零基础记得都收藏哦
今天就为大家分享一篇python 多进程队列数据处理详解,具有很好的参考价值,希望对大家有所帮助.喜欢的话记得点赞转发关注不迷路哦!!! 总之了写到多进程队列数据处理问题,也就不多废话了,直接来上代码 ...
- python多进程队列中的队列_python 多进程队列数据处理详解
我就废话不多说了,直接上代码吧! # -*- coding:utf8 -*- import paho.mqtt.client as mqtt from multiprocessing import P ...
- BlockingQueue(阻塞队列)详解
推荐:Java并发编程汇总 BlockingQueue(阻塞队列)详解 原文地址 BlockingQueue 一. 前言 在新增的Concurrent包中,BlockingQueue很好的解决了多线程 ...
- 消息队列超详解(以RabbitMQ和Kafka为例,为何使用消息队列、优缺点、高可用性、问题解决)
消息队列超详解(以RabbitMQ和Kafka为例) 为什么要用消息队列这个东西? 先说一下消息队列的常见使用场景吧,其实场景有很多,但是比较核心的有3个:解耦.异步.削峰. 解耦:现场画个图来说明一 ...
- python 消息队列 get是从队首还是队尾取东西_python分布式爬虫中消息队列知识点详解...
当排队等待人数过多的时候,我们需要设置一个等待区防止秩序混乱,同时再有新来的想要排队也可以呆在这个地方.那么在python分布式爬虫中,消息队列就相当于这样的一个区域,爬虫要进入这个区域找寻自己想要的 ...
- php mysql 任务队列_PHP+MySQL实现消息队列步骤详解
这次给大家带来PHP+MySQL实现消息队列步骤详解,PHP+MySQL实现消息队列的注意事项有哪些,下面就是实战案例,一起来看一下. 最近遇到一个批量发送短信的需求,短信接口是第三方提供的.刚开始想 ...
- python 消息队列 flask_python分布式爬虫中消息队列知识点详解
当排队等待人数过多的时候,我们需要设置一个等待区防止秩序混乱,同时再有新来的想要排队也可以呆在这个地方.那么在python分布式爬虫中,消息队列就相当于这样的一个区域,爬虫要进入这个区域找寻自己想要的 ...
- jQuery队列控制方法详解queue()/dequeue()/clearQueue()
jQuery核心中, 有一组队列控制方法, 这组方法由queue()/dequeue()/clearQueue()三个方法组成, 它对需要连续按序执行的函数的控制可以说是简明自如, 主要应用于anim ...
- python 进程间通信效率_Python进程间通信 multiProcessing Queue队列实现详解
一.进程间通信 IPC(Inter-Process Communication) IPC机制:实现进程之间通讯 管道:pipe 基于共享的内存空间 队列:pipe+锁的概念--->queue 二 ...
最新文章
- Action Golf 四个魔法球实战训练系列_huatuo_新浪博客
- Leetcode 116. 填充每个节点的下一个右侧节点指针 解题思路及C++实现
- Java-ThreadLocal三种使用场景
- MixPath:基于权重共享的神经网络搜索统一方法
- Unity的Json解析二–写Json文件
- 表的连接方式:NESTED LOOP、HASH JOIN、SORT MERGE JOIN【转】
- lucene学习之helloworld(简单实例)
- java 蓝桥杯算法提高 成绩排序2
- tensorflow 在加载大型的embedding模型参数时,会遇到cannot be larger than 2GB
- OAuth2.0认证流程原理
- Md5加密工具类DigestUtils
- 黑苹果开启核显加速_【黑苹果】关于双显卡正确开启核显加速
- raspberry pi系统配置
- 虾皮「光速大裁员」:7分钟大会后,软件瞬间查无此人
- Android开发之路:搞懂这几个问题,就掌握了屏幕适配原理
- 视频怎么压缩变小?视频压缩变小的具体操作步骤
- C语言中对字符串的加密和解密
- 使用Openssl签发SSL证书
- xxx学校/学院/大学信息管理系统
- 小傻蛋的妹妹跟随小甲鱼学习Python的第四节004
热门文章
- directadmin php5.6,directadmin教程
- linux虚拟机双显卡,Kali Linux 2.0 安装 NVIDIA显卡驱动实现双显卡(联想笔记本)
- arcgis晕带制作
- UG二次开发GRIP总结简明教程
- VMWare VMNet 8 的配置使用
- 使用Linux搭建软路由
- mysql-cluster安装与配置
- 201521123091 《Java程序设计》第11周学习总结
- 王之泰201771010131《面向对象程序设计(java)》第十三周学习总结
- wap建站程序源码_织梦程序搭建网站实例教程,想尝试搭建网站的朋友赶紧保存了...