C++ STL之队列queue和双端队列deque

一. 概述

1.1 queue

std::queue 是 C++ STL 中的一个容器适配器,用于实现先进先出(FIFO,First In First Out)的数据结构,它允许在一端添加元素(称为队尾),并在另一端移除元素(称为队首)

注:

  • 先进先出:第一个插入的元素最先被移除
  • 底层容器:通常使用 deque 或 list 作为底层容器。
  • 不支持随机访问。只能通过队头和队尾操作。且元素只能从队尾添加并从队首移除
  • 当队列为空时,调用 front、back 或 pop 会导致未定义行为。

1.2 deque

std::deque 是 C++ STL 中的双端队列,允许在两端高效地插入和删除元素。在C++中以模板类的形式存在,允许存储任意类型的数据

注:

  • 双端队列:可以在队首和队尾进行插入和删除操作。在两端插入和删除元素的时间复杂度为 O(1),而在中间插入或删除的时间复杂度为 O(n)。
  • 类型泛化:可以存储任意类型,包括内置类型、自定义类等。
  • 动态大小:可以根据需要动态扩展
  • 支持随机访问,能够使用下标访问元素。

二. 初始化

2.1 头文件

#include <queue> // 队列#include <deque> // 双端队列

2.2 queue的初始化

// 默认构造
queue<int> q;// 使用 deque 初始化队列
deque<int> d = {1, 2, 3};
queue<int> q(d); // 初始化列表
queue<int> q({1, 2, 3});  // 拷贝构造
queue<int> q1;
q1.push(1);
q1.push(2);
queue<int> q2 = q1;  

2.3 deque的初始化

// 默认构造
deque<int> d;// 初始化列表
deque<int> d = {1, 2, 3};// 指定大小并初始化元素
deque<int> d(5); // 指定大小并指定初始值
deque<int> d(5, 10);// 通过已有容器初始化
vector<int> v = {1, 2, 3};
deque<int> d(v.begin(), v.end()); 

三. 成员函数

3.1 queue

接口含义
push添加元素到队尾。
pop移除队头元素。
front返回队首元素的引用。
back返回队尾元素的引用。
empty判断队列是否为空,空(true)。
size获取队列中元素个数。
emplace在队尾直接构造元素,避免了不必要的复制或移动操作。

3.2 deque

接口含义
push_back在队尾添加元素。
push_front在队头添加元素。
pop_back移除队尾元素。
pop_front移除队头元素。
front返回队首元素的引用。
back返回队尾元素的引用。
empty判断队列是否为空,空(true)。
size获取队列中元素个数。
resize改变实际元素的个数。
assign用新元素替换原有内容。
operator[]访问指定索引的元素。
at使用经过边界检查的索引访问元素。
begin返回指向容器中第一个元素的迭代器。
end返回指向容器最后一个元素所在位置后一个位置的迭代器。
rbegin返回指向最后一个元素的迭代器。
rend返回指向第一个元素所在位置前一个位置的迭代器。
cbegin和 begin 相同,但在其基础上,增加了 const 属性,不能用于修改元素。
cend和 end 相同,但在其基础上,增加了 const 属性,不能用于修改元素。
crbegin和 rbegin 相同,但在其基础上,增加了 const 属性,不能用于修改元素。
crend和 rend 功能相同,但在其基础上,增加了 const 属性,不能用于修改元素。
insert在指定的位置插入一个或多个元素。
erase移除一个元素或多个元素。
clear移出所有的元素,容器大小变为 0。
swap交换两个容器的所有元素。
emplace在指定的位置直接生成一个元素。

四. 遍历方式

4.1 queue

不支持直接遍历,因为它没有提供迭代器(因此不能直接使用范围基于的 for 循环)

4.1.1 使用 pop 方法遍历

注意队列的内容会被修改,因此在遍历后队列将变为空

#include <iostream>
#include <queue>
using namespace std;int main() {queue<int> q;q.push(1);q.push(2);q.push(3);// 通过 pop 遍历队列while (!q.empty()) {cout << q.front() << " ";  // 输出队头元素q.pop();  // 移除队头元素}return 0;
}
/*
output:
1 2 3
*/
4.1.2 使用辅助容器

使用辅助容器可以保留原队列的内容,但会增加额外的内存开销

#include <iostream>
#include <queue>
#include <vector>
using namespace std;int main() {queue<int> q;q.push(1);q.push(2);q.push(3);// 将元素复制到 vectorvector<int> vec;while (!q.empty()) {vec.push_back(q.front());q.pop();}// 遍历 vectorfor (const auto& value : vec) {cout << value << " ";  // 输出 1 2 3}return 0;
}
/*
output:
1 2 3
*/
4.1.3 使用 std::deque 作为底层容器
#include <iostream>
#include <queue>
#include <deque>
using namespace std;int main() {deque<int> d = {1, 2, 3};queue<int, deque<int>> q(d);  // 使用 deque 初始化队列// 通过 deque 遍历for (const auto& value : d) {cout << value << " ";  // 输出 1 2 3}return 0;
}
/*
output:
1 2 3
*/

4.2 deque

4.2.1 for循环
#include <iostream>
#include <deque>
using namespace std;int main() {deque<int> d = {1, 2, 3, 4, 5};for (size_t i = 0; i < d.size(); ++i) {cout << d[i] << " ";}return 0;
}
/*
output:
1 2 3 4 5 
*/
#include <iostream>
#include <deque>
using namespace std;int main() {deque<int> d = {1, 2, 3, 4, 5};for (const auto& value : d) {cout << value << " ";}return 0;
}
/*
output:
1 2 3 4 5 
*/
4.2.2 迭代器
#include <iostream>
#include <deque>
using namespace std;int main() {deque<int> d = {1, 2, 3, 4, 5};for (auto it = d.begin(); it != d.end(); ++it) {cout << *it << " ";}return 0;
}
/*
output:
1 2 3 4 5 
*/
4.2.3 反向迭代器
#include <iostream>
#include <deque>
using namespace std;int main() {deque<int> d = {1, 2, 3, 4, 5};for (auto it = d.rbegin(); it != d.rend(); ++it) {cout << *it << " ";}return 0;
}
/*
output:
5 4 3 2 1 
*/

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

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

相关文章

DETR论文翻译与理解

DETR&#xff08;Detection with transformer&#xff09; DETR&#xff1a;End to End Object Detection with Transformer 论文链接&#xff1a;2005.12872 (arxiv.org) 参考视频&#xff1a;https://www.bilibili.com/video/BV1GB4y1X72R/?spm_id_from333.788&vd_…

硬件工程师笔试面试——开关

目录 11、开关 11.1 基础 开关原理图 开关实物图 11.1.1 概念 11.1.2 常见的开关类型及其应用 11.2 相关问题 11.2.1 开关的工作原理是什么? 11.2.2 在设计一个电子系统时,如何选择最适合的开关类型? 11.2.3 不同类型的开关在实际应用中有哪些优势和局限性? 11.…

爵士编曲:爵士鼓编写 爵士鼓笔记 底鼓和军鼓 闭镲和开镲 嗵鼓

底鼓和军鼓 底鼓通常是动的音色&#xff0c;军鼓通常是大的音色。 “动”和“大”构成基础节奏。“动大”听着不够有连接性&#xff0c;所以可以加入镲片&#xff01; 开镲 直接鼓棒敲击是开镲音色 闭镲 当脚踩下踏板&#xff0c;2个镲片合并&#xff0c;然后用鼓棒敲击&am…

java(3)数组的定义与使用

目录 1.前言 2.正文 2.1数组的概念 2.2数组的创建与初始化 2.2.1数组的创建 2.2.1数组的静态初始化 2.2.2数组的动态初始化 2.3数组是引用类型 2.3.1引用类型与基本类型区别 2.3.2认识NULL 2.4二维数组 2.5数组的基本运用 2.5.1数组的遍历 2.5.2数组转字符串 2.…

面向对象程序设计——set容器の简析

1.set的介绍 • 序列式容器和关联式容器 • 我们已经接触过STL中的部分容器如&#xff1a;string、vector、list、deque、array、forward_list等&#xff0c;这些容器统称为序列式容器&#xff0c;因为逻辑结构为线性序列的数据结构&#xff0c;两个位置存储的值之间⼀般没有紧…

图片马赛克处理(Java)

1.需求 给图片的指定区域打码给整张图片打码马赛克方格取色支持中心点取色和随机取色马赛克支持灰度处理 2.源码 package com.visy.utils;import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOE…

(k8s)Kubernetes部署Promehteus

转载&#xff1a;Kubernetes&#xff08;k8s&#xff09;部署Promehteus 一、概述 在1.8版本以后heapster由metrics-server替代&#xff1b;从k8s的v1.11版本开始已经全面转向以Prometheus为核心的新监控体系架构&#xff1b;kube-prometheus 中包含了 prometheus 监控所用到的…

pg入门18—如何使用pg gis

1. 下载postgre gis镜像 2. 运行镜像 docker run -p 15432:5432 -d -e POSTGRES_PASSWORDAb123456! postgis/postgis:12-3.4-alpine 3. 使用gis # 进入容器&#xff0c;登录pgdocker exec -it bash# 登录数据库psql -U postgres# 创建数据库CREATE DATABASE mygeotest;# 使用…

算法:双指针题目练习

文章目录 算法:双指针移动零复写零快乐数盛最多水的容器有效三角形的个数查找总价格为目标值的两个商品三数之和四数之和 总结 算法:双指针 移动零 定义两个指针,slow和fast.用这两个指针把整个数组分成三块. [0,slow]为非零元素,[slow1,fast-1]为0元素,[fast,num.length]为未…

【Web】御网杯信息安全大赛2024 wp(全)

目录 input_data admin flask 如此多的FLAG 一夜醒来之全国CTF水平提升1000倍&#x1f60b; input_data 访问./.svn后随便翻一翻拿到flag admin dirsearch扫出来 访问./error看出来是java框架 测出来是/admin;/路由打Spring View Manipulation(Java)的SSTI https:/…

基于ECC簇内分组密钥管理算法的无线传感器网络matlab性能仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于ECC簇内分组密钥管理算法的无线传感器网络matlab性能仿真&#xff0c;对比网络通信开销&#xff0c;存活节点数量&#xff0c;网络能耗以及数据通信量四个指标…

【Linux篇】TCP/IP协议(笔记)

目录 一、TCP/IP协议族体系结构 1. 数据链路层 &#xff08;1&#xff09;介绍 &#xff08;2&#xff09;常用协议 ① ARP协议&#xff08;Address Resolve Protocol&#xff0c;地址解析协议&#xff09; ② RARP协议&#xff08;Reverse Address Resolve Protocol&…

华为为什么要做三折叠屏手机?

前些天我做了一条视频&#xff0c;关于讲华W的新的三折叠屏手机。我说我有点失望&#xff0c;结果引起了华W的同事的一些关注。于是&#xff0c;华W几位高管都跑过来&#xff0c;跟我解释为什么会出现这样的一个状态。 我才知道&#xff0c;这款手机他们其实是亏着钱在卖的。因…

C++速通LeetCode中等第1题-字母异位词分组

思路要点&#xff1a;对字符串排序&#xff0c;排序结果存放在map的key中&#xff0c;排序结果相同的字符串存放到map的value中 。 class Solution { public:string keys;vector<vector<string>> groupAnagrams(vector<string>& strs) {vector<vecto…

EECS498 Deep Learning for Computer Vision (一)软件使用指南

#最近开始学习深度学习的相关基础知识&#xff0c;记录一下相关笔记及学习成果# learning&#xff1a;building artificial systems that learn from data and experience deep learning(a set of machine learning): hierarchical learning algorithms with many "laye…

海洋大地测量基准与水下导航系列之二国外海底大地测量基准和海底观测网络发展现状(上)

海底大地控制网建设构想最先由美国斯克里普斯海洋研究所(Scripps Institution of Oceanography,SIO)提出&#xff0c;目前仅有少数发达国家具备相应技术条件。美国、日本、俄罗斯和欧盟等发达国家通过布测先进的海底大地控制网&#xff0c;不断完善海洋大地测量基准基础设施&am…

6、等级保护政策内容

数据来源&#xff1a;6.等级保护政策内容_哔哩哔哩_bilibili 信息安全产品管理与响应 等级管理 对信息系统中使用的信息安全产品实行按等级管理&#xff0c;信息安全事件应分等级响应与处置。 预测评服务由测评公司和咨询公司提供预测评服务&#xff0c;根据技术要求和测评要…

深度学习01-概述

深度学习是机器学习的一个子集。机器学习是实现人工智能的一种途径&#xff0c;而深度学习则是通过多层神经网络模拟人类大脑的方式进行学习和知识提取。 深度学习的关键特点&#xff1a; 1. 自动提取特征&#xff1a;与传统的机器学习方法不同&#xff0c;深度学习不需要手动…

前端工程化4:从0到1构建完整的前端监控平台

前言 一套完整的前端监控系统的主要部分&#xff1a; 数据上报方式数据上送时机性能数据采集错误数据采集用户行为采集定制化指标监控sdk 监控的目的&#xff1a; 一、数据上报方式 本文的方案是&#xff0c;优先navigator.sendBeacon&#xff0c;降级使用1x1像素gif图片…

Python3网络爬虫开发实战(17)爬虫的管理和部署(第一版)

文章目录 一、 Scrapyd 分布式部署1.1 了解 Scrapyd1.2 准备工作1.3 访问 Scrapyd1.4 Scrapyd 的功能1.5 ScrapydAPI 的使用 二、Scrapyd-Client 的使用2.1 准备工作2.2 Scrapyd-Client 的功能2.3 Scrapyd-Client 部署 三、Scrapyd 对接 Docker3.1 准备工作3.2 对接 Docker 四、…