C++【STL】queue和deque 容器详解

news2024/10/5 14:16:43

@C++【STL】queue和deque 容器详解

一级目录

二级目录

三级目录

1. 什么是queue容器?

Queue是一种先讲先出( First In First Out,FIFO )的数据结构,它有两个出口。

queue模版类的定义在头文件中。
include
定义queue对象的示例代码如下∶

queue<int>q1;
queue<double>q2;

如图:
在这里插入图片描述

2. queue的初始化函数

queue<int>q;
queue<int>q2(q1)

3. queue的相关函数

push(elem);   //往队尾添加元素

pop();    //从队头移除元素

back();   //返回最后一个元素

front();   //返回第一个元素

empty();   //判断队列是否为空

size();  // 返回队列大小

案例:

 #include<iostream>
#include<queue>
using namespace std;

int main()
{
queue<int>q1;
q1.push(1);
q1.push(2);
q1.push(3);
q1.push(4);
cout<<q1.size()<<endl;   //输出队列长度

int first =q1.front();
int end= q1.back();

q1.pop();  //移除首元素

while(!q1.empty())
{
cout<<q1.front()<<" ";
q1.pop();
}

return 0;
}

4. 实践案例

有一堆扑克牌,里面有n张扑克牌。第一次从牌堆顶上拿出一张牌并输出,第二次把牌放回牌堆底下。重复执行直到牌堆里没牌。也就是说奇数张的牌输出,偶数张的牌放回。
输入:
4
1 2 3 4
输出:
1 3 2 4

解析:

#include<iostream>
#include<queue>
using namespace std;

int main()
{
queue<int>q;
int n=0;
cin>>n;
int temp=0;
for(int i=0;i<n;i++)
{
    cin>>temp;
    q.push(temp);
}
bool flag=1;
while(!q.empty()))
{
if(flag)
{
cout<<q.front()<<" ";
flag=0;
}
else
{
q.push(q.front());
flag=1;
}
q.pop();
}

return 0;
}

4. 什么是deque容器?

deque双端队列,可以对头端和尾端进行插入删除操作。

deque队列为一个给定类型的元素进行线性处理,像向量 一样,它能够快速地随机访问任一个元素,并且能够高效地插入和删除容器的尾部元素。但它又与vector不同,deque支持高效插入和删除容器的头部元素。

如图:
在这里插入图片描述

5. deque的初始化函数


deque<T> deqT; //默认构造形式

deque(beg, end); //构造函数将[beg,eind]区间中的元素拷贝给本身

deque(n, elem);   //构造函数将n个elem拷贝给本身

deque(const deque &deq); //拷贝构造函数

deque<int> a;    //该队列为空

deque<int> a1(10);    //该队列的大小为10,默认值为0

deque<int> a2(10,1);   //该队列的大小为10,默认值为1

deque<int> a3(a2);      //拷贝a2

deque<int> a4(a2.begin(),a2.begin()+2);
//将a2在区间[begin,begin+2)的元素赋值给a4,即两个10

6. deque的插入函数


d.push_front(const T& x); //头部添加元素

d.push_back(const T& x); //末尾添加元素

d.insert(iterator it, const T& x); //任意位置插入一个元素
d.insert(iterator it, int n, const T& x); //任意位置插入n个相同元素
d.insert(iterator it, iterator first, iterator last);
//插入另一个向量的[forst,last)间的数据

案例:

#include<iostream>
#include<deque>

using namespace std;
template<class T>

void Print(deque<T> arr)
{
    while(!arr.empty())
    {
        cout<<*(arr.begin())<<endl;
        arr.pop_front();
    }
    cout<<endl;
}

int main()
{
deque<int> d;
d.push_front(4);

d.push_back(3);
Print(d);

deque<int>:: iterator it=d.begin();
d.insert(it,6);
Print(d);

it=d.begin();
d.insert(it,2,8);
Print(d);

deque<int>d1(2,7);
it=d.begin()+1;
d.insert(it,d1.begin(),d1.end());
Print(d);

return 0;
}

7. deque的删除函数


d1.pop_front();
//头部删除元素

d1.pop_back();
//末尾删除元素

d1.erase(iterator it);
//任意位置删除一个元素

d1.erase(iterator first, iterator last)//删除[first,last)之间的元素

d1.clear();
//清空所有元素

案例:

#include<iostream>
#include<deque>

using namespace std;
template<class T>

void Print(deque<T> arr)
{
    while(!arr.empty())
    {
        cout<<*(arr.begin())<<endl;
        arr.pop_front();
    }
    cout<<endl;
}

int main()
{
deque<int>d1;
for(int i=0;i<8;i++)
d1.push_back(i);
Print(d1);

d1.pop_front();
Print(d1);

d1.pop_back();
Print(d1);

deque<int>:: iterator it=d1.begin();
d1.erase(it);
Print(d1);

d1.erase(d1.begin(),d1.begin()+1);
Print(d1);

d1.clear();
Print(d1);

return 0;
}

8. deque的访问函数


下标访问:deq[1];//并不会检查是否越界at方法访问

at: deq.at(1);
//以上两者的区别就是at会检查是否越界,是则抛出out of range异常

//访问第一个元素
deq.front();

//访问最后一个元素
deq.back();

9. deque大小函数

d.size();   //容器大小

d.max_size();  //容器最大容量

d.resize();//更改容器大小

deq.empty();//容器判空

deq.shrink_to_fit();//减少容器大小到满足元素所占存储空间的大小

案例:

#include<iostream>
#include<deque>

using namespace std;
template<class T>

void Print(deque<T> arr)
{
    while(!arr.empty())
    {
        cout<<*(arr.begin())<<endl;
        arr.pop_front();
    }
    cout<<endl;
}

int main()
{
deque<int>d1;
for(int i=0;i<8;i++)
d1.push_back(i);

cout<<d1.size()<<endl;

cout<<d1.max_size()<<endl;

d1.resize(0);
cout<<d1.size()<<endl;

if(d1.empty())
{
    cout<<"元素为空"<<endl;
}
return 0;

}

10. deque其他函数


deq.assign(int nSize, const T& x);  
//多个元素赋值Ⅱ类似于初始化时用数组进行赋值

swap(deque&);   //交换两个同类型容器的元素

案例:

#include<iostream>
#include<deque>

using namespace std;
template<class T>

void Print(deque<T> arr)
{
    while(!arr.empty())
    {
        cout<<*(arr.begin())<<" ";
        arr.pop_front();
    }
    cout<<endl;
}

int main()
{
deque<int>d1;
d1.assign(3,1);
Print(d1);
deque<int>d2;
d2.assign(3,2);
Print(d2);

d1.swap(d2);
Print(d1);
Print(d2);

return 0;

}

11. deque案例

请设计一个排队程序,用户有普通客人和VIP客人之分,VIP客人不排队(即VIP客人在队列头部),请将已有的guest1和guest2放入队列中( guest1排在guest2前),并将VIP客人新增至队列头部。
输入描述:

输出描述︰
VIP客人姓名 guest1姓名 guest2姓名(每个客人的名字用空格隔开)

#include<iostream>
#include<deque>

using namespace std;


typedef struct  Guest{
    string name;
    bool Vip;
}Guest;

int main()
{
Guest p={"xiaoming",false};
Guest p1={"xiaohong",false};
Guest p2={"xiaowang",true};

deque<Guest>d;

d.push_back(p);
d.push_back(p1);
d.push_front(p2);

while(!d.empty())
{
    cout<<d.front().name<<" ";
    d.pop_front();
}

return 0;

}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/777671.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【华为c# OD机考参考答案】01---IPv4地址转换成整数

题目 1、题目 01---IPv4地址转换成整数2、解图思路 1、IP地址转为二进制 2、二进制转十进制 3、注意事项 1、IP地址的范围判断 2、空字符串判断 3、非法字符判断 4、考点 1、string的split 、convert等相关用法 2、正则表达式 3、进制转换 4、理解32位整数的意思 5、代码 判…

2023华为OD统一考试(B卷)题库清单(持续收录中)以及考点说明

目录 专栏导读2023 B卷 “新加题”&#xff08;100分值&#xff09;2023Q2 100分2023Q2 200分2023Q1 100分2023Q1 200分2022Q4 100分2022Q4 200分牛客练习题 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#xff09;》。 刷的越多&…

【实用工具】-Git+GitLab

1. Git介绍 1.1 什么是Git&#xff1f; Git是一个分布式版本控制系统&#xff0c;用于跟踪和管理项目代码的变化。它是由Linus Torvalds于2005年创建的&#xff0c;旨在帮助开发者更好地协作、追踪代码的更改&#xff0c;并轻松地回滚到之前的版本。 Git相比传统的集中式版本…

网络安全 Day17-计算机网络知识02

计算机网络知识02 1. 交换机2. 网络知识名词3. ARP3.1 ARP通讯原理3.2 arp欺骗3.3 ARP欺骗与预防3.4 排查ARP病毒 4. 路由器 1. 交换机 什么是交换机 实现一个网络内多台主机之间通讯的设备用于电信号转发和放大的网络设备 常见的交换机&#xff1a;以太网交换机&#xff0c;电…

【Java】SpringBoot下写一个全局捕获异常的怎么实现?

文章目录 前言一、全局异常处理方式一1.1 自定义全局异常类1.2 手动抛出异常1.3 测试打印 二、全局异常处理方式二2.1 定义基础接口类2.2 定义枚举类2.3 自定义异常类2.4 自定义数据传输2.5 自定义全局异常处理2.6 测试代码 总结 前言 在日常项目开发中&#xff0c;异常是常见…

Nginx 用户指南:安装、配置和基本使用

前言 本用户指南将帮助您了解如何安装、配置和基本使用 Nginx。Nginx 是一款高性能的开源 Web 服务器和反向代理服务器&#xff0c;具有强大的性能和灵活性&#xff0c;可以满足各种 Web 服务器需求。 安装 Nginx a. 在 Ubuntu 上安装&#xff1a; $ sudo apt update $ sud…

(转载)神经网络遗传算法函数极值寻优(matlab实现)

本博客的完整代码获取&#xff1a; https://www.mathworks.com/academia/books/book106283.html 1案例背景 对于未知的非线性函数,仅通过函数的输入输出数据难以准确寻找函数极值。这类问题可以通过神经网络结合遗传算法求解,利用神经网络的非线性拟合能力和遗传算法的非线性…

【前端动画】科技感扫描效果 css动画animation

扫描出现动画 参考了网友写的二维码扫描 <template><div><div class"scan-content"><img style"width: 2rem;height: 2rem;" src"../../assets/images/eye.png" alt"" /><div class"line">…

四个现实中的商品样例,帮助你理解如何使用css【前端CSS入门样例】

实现商品列表 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>商品列表图片</title><style>.row > img {width: 15%;}</style></head><body><div class"row"><img sr…

【NOSQL】MongoDB

MongoDB MongoDB简介体系结构Linux系统中的安装启动和连接&#xff08;1&#xff09;先到官网下载压缩包——>解压——>重命名新建几个目录&#xff0c;分别用来存储数据和日志&#xff1a;新建并修改配置文件官网下载MongoDB Compass MongoDB简介 MongoDB是一个开源、高…

从零开始学习 Java:简单易懂的入门指南(二)

Java基础语法 1. 注释1.1使用的技巧1.2注意点 2. 关键字2.1 概念2.2 第一个关键字class 3. 字面量3.1区分技巧 4. 变量4.1 什么是变量&#xff1f;4.2 变量的定义格式4.2.1 格式详解4.2.2 常用的数据类型4.2.3 变量的注意事项 4.3 变量的练习 5. 数据类型5.1 Java语言数据类型的…

CentOS7系统MBR、GRUB2、内核启动流程报错问题

目录 &#x1f969;Linux启动流程 &#x1f969;MBR修复 &#x1f36d;1、模拟损坏 &#x1f36d;2、重启测试 &#x1f36d;3、修复MBR &#x1f36d;4、测试系统 &#x1f969;GRUB2修复 &#x1f36d;1、模拟损坏 &#x1f36d;2、修复GRUB2 &#x1f36d;3、测试系统 &…

【C++】string类模拟实现

&#x1f680; 作者简介&#xff1a;一名在后端领域学习&#xff0c;并渴望能够学有所成的追梦人。 &#x1f681; 个人主页&#xff1a;不 良 &#x1f525; 系列专栏&#xff1a;&#x1f6f8;C &#x1f6f9;Linux &#x1f4d5; 学习格言&#xff1a;博观而约取&#xff0…

基于 Docker + Nginx + Gitlab-runner 实现前端自动化部署流程

本篇会用到Docker&#xff0c;Gitlab-runner等相关工具&#xff0c;如果对其不是特别了解&#xff0c;可以参考下相关文档&#xff1a; GitLab RunnerDocker 快速入门CI/CD&#xff1a;持续集成/持续部署 在早期部署前端项目时&#xff0c;我们通常会通过ftp把前端代码直接传…

AcWing 239. 奇偶游戏—带边权并查集、带扩展域并查集解法

AcWing 239. 奇偶游戏—带边权并查集、扩展域 问题带边权并查集解法扩展域解法并查集所要掌握的知识技能如下图所示 问题 题目链接: AcWing 239. 奇偶游戏 问题描述 分析 这道题比较有意思&#xff0c;可以由前缀和的思想来解决&#xff0c;[l,r]为偶数&#xff0c;说明[0,l…

CentOS8.5 安装时配置镜像源

CentOS8.5 安装时配置镜像源 阿里云镜像地址 http://mirrors.aliyun.com/centos/8-stream/BaseOS/x86_64/os/ 安装时录入镜像源 点击Done等待… 搞定

day30-Auto Text Effect(自动文本吐字效果)

50 天学习 50 个项目 - HTMLCSS and JavaScript day30-Auto Text Effect&#xff08;自动文本吐字效果&#xff09; 效果 index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewpo…

玩转 PI 系列-如何在 Rockchip Arm 开发板上安装 Docker Tailscale K3s Cilium?

概述 618 买了几个便宜的 Purple PI OH 开发板 (500 块多一点买了 3 个&#x1f911;), 这个开发板类似树莓派&#xff0c;是基于 Rockchip&#xff08;瑞芯微&#xff09; 的 rx3566 arm64 芯片。如下&#xff1a; 买来是用作家庭服务器或家庭实验室的。主要考虑就是&#xf…

CTFHub | 过滤目录分隔符

0x00 前言 CTFHub 专注网络安全、信息安全、白帽子技术的在线学习&#xff0c;实训平台。提供优质的赛事及学习服务&#xff0c;拥有完善的题目环境及配套 writeup &#xff0c;降低 CTF 学习入门门槛&#xff0c;快速帮助选手成长&#xff0c;跟随主流比赛潮流。 0x01 题目描述…

订单逆向履约系统的建模与PaaS化落地实践 | 京东云技术团队

导读 本文重点介绍了京东零售电商业务在订单逆向履约上面的最佳技术实践&#xff0c;京东零售快退平台承接了零售几乎所有售前逆向拦截和退款业务&#xff0c;并在长期的业务和技术探索中沉淀了丰富的业务场景设计方案、架构设计经验&#xff0c;既能承接面向消费者C端用户的高…