队列queue

本文详细介绍了C++中的queue(普通队列)、priority_queue(优先队列,包括大顶堆和小顶堆的应用)以及deque(双端队列)的基本操作和区别,重点突出了它们的特点和适用场景。
摘要由CSDN通过智能技术生成

队列

1、queue队列

1.1 创建queue队列

queue<数据类型,容器类型>q;

数据类型:一般是double或者int等基本类型,也可以是自定义的结构体;
容器类型:一般为deque或者list(双向链表),省略时以deque为默认容器。
声明代码如下:

queue<int> q;  //使用默认的双端队列为底层容器创建一个空的queue队列对象q,数据元素为int类型。
queue<int> q[20];  //规定队列元素数量
queue<int,list<int>> q1;
queue<int,list<int>> q2(q1);
/*复制构造函数(queue(const queue&)),用一个queue对象创建新的queue对象。 
利用queue对象q1,创建一个以双向链表为底层容器的queue对象q2*/

1.2 基本操作

先进先出,只能队尾插入,队首弹出,无法Index遍历,也不可以迭代器遍历

q.push(x);      //入队,将元素 x 从队尾插入(尾插法)
q.pop();        //出队,删除队首元素
q.size();       //返回队中元素个数
q.front();      //返回队首元素
q.back();       //返回队尾元素
q.empty();      //判断是否为空(空返回 1,非空返回 0)
q1.swap(q2);    //q1和q2交换

2、priority_queue优先队列

2.0 题目

1、力扣347,前K个高频元素(大顶堆、小顶堆)

2.1 创建基本优先队列

优先队列是一种会按照默认或自定义的优先级进行自动排序的队列,其特点是优先级高的元素排在队首,低的排在队尾。头文件#include< queue > 中提供了两种可直接引用的优先规则(排序规则):greater、less;其中,less是默认优先规则,表示数字大的优先级大(字符型用ASCLL码比较),放在队首;greater表示数字小的优先级大,放在队首。
priority_queue<数据类型,容器类型,优先规则> pq;

数据类型:一般是double或者int等基本类型,也可以是自定义的结构体;
容器类型:一般为deque(双端列表)、vector(向量容器),可省略,省略时以vector为默认容器。

priority_queue<int> pq;
priority_queue<int,vector<int>,less<int> > pq;   //以less为排列规则(大顶堆,表示顶堆元素比其他都大)
priority_queue<int,vector<int>,greater<int> > pq; //以greater为排列规则(小顶堆,表示顶堆元素比其他都小)
排序规则:
1、传入两个参数a,b,返回true则a的优先级小于b的优先级;
2、less(<),a<b为true,则a的优先级小于b的优先级,小数优先级低;
3、greater(>),a>b为true,则a的优先级小于b的优先级,大数优先级低;

2.2 基本操作

pq.push();    //入队
pq.pop();     //出队
pq.size()     //返回当前对中元素个数
pq.top();     //优先队列   取队首元素
pq.empty();   //判断是否为空(空返回 1,非空返回 0)

3、deque双端队列

可以队首和队尾插入,也可以队首和队尾弹出,支持随机访问,即可以直接用下标来访问元素。它和vector有点像,因为它可以index索引和at()函数索引,当然,也可以迭代器索引。此外,它可以进行指定尺寸的构造-queue就不可以指定尺寸构造。

3.0 题目

1、力扣239:滑动窗口最大值

3.1 创建双端队列

函数声明接口声明
deque()构造空的队列
deque(size_type n, const value_type& val = value_type())用n个值为val的元素构造双端队列
deque(InputIterator first, InputIterator last)用(fist,last)的区间构造双端队列
deque(const deque& x)双端队列的拷贝函数

3.2 基本操作

1. assign(beg, end);  //将[beg,end)区间中的数据拷贝赋值给本身。
2. assign(n,elem); //将n个elem拷贝赋值给本身。
3. empty(); //判断容器是否为空
4. size(); //返回容器中的元素的个数
5. resize(num); //重新指定容器的长度为num,若容器变长,则以默认值填充新位置。
                      //如果容器变短,则末尾超出容器长度的元素被删除。
6. resize(num,elem); //重新指定容器的长度为num,若容器变长,则以elem值填充新位置。
                           //如果容器变短,则末尾超出容器长度的元素被删除。
7. push_back(elem);  //在容器尾部添加一个数据
8. push_front(elem);  //在容器头部插入一个数据
9. pop_back();  //删除容器最后一个数据
10. pop_front();  //删除容器第一个数据
11. insert(pos,elem);  //在pos位置插入一个elem元素的拷贝,返回新数据的位置。
12. insert(pos,n,elem); //在pos位置插入n个elem数据,无返回值
13. insert(pos,beg,end);  //在pos位置插入[beg,end)区间的数据,无返回值
14. clear();  //清空容器的所有数据
15. erase(beg,end);  //删除[beg,end)区间的数据,返回下一个数据的位置。
16. erase(pos); //删除pos位置的数据,返回下一个数据的位置。
17. at(int idx); //返回索引idx所指的数据
18. operator[]; //返回索引idx所指的数据
19. front(); //返回容器中第一个数据元素
20. back(); //返回容器中最后一个数据元素

3.3 deque与vector的区别

# 参考:[124971205](https://blog.csdn.net/zhendong825/article/details/124971205)
1.vector对于头部的插入效率低,数据量越大,效率越低,例如头部后有十万个数据,则往头部插入一个数据时,十万个数据都需要往后挪一挪才能在头部插入数据。deque相对而言,对头部的插入删除速度会比vector快
2.vector是连续的,deque是分段连续的,每一段的地址用数组保存,在队尾或者队首增加数据时,增加一段空间即可,刷新数组的数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值