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,一经查实,立即删除!

相关文章

《算法笔记》例题解析 第3章入门模拟--4日期处理(9题)2021-03-03

日期 题目描述 Time Limit: 1000 ms Memory Limit: 256 mb 今天是2012年4月12日星期四&#xff0c;编写程序&#xff0c;输入今天开始到12月31日之间的任意日期&#xff0c;输出那一天是星期几。例如输入“5&#xff08;回车&#xff09;20&#xff08;回车&#xff09;”&am…

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_…

C++学习笔记(37)

302、makefile 在实际开发中&#xff0c;项目的源代码文件比较多&#xff0c;按类型、功能、模块分别存放在不同的目录和文件中&#xff0c;哪 些文件需要先编译&#xff0c;那些文件后编译&#xff0c;那些文件需要重新编译&#xff0c;还有更多更复杂的操作。 make 是一个强大…

mysql性能优化- 数据库配置优化

MySQL 性能优化 - 数据库配置优化 MySQL 是一个广泛使用的关系型数据库管理系统&#xff0c;但随着数据量的增长和访问频率的提高&#xff0c;其性能可能会成为瓶颈。为了保持高效的性能&#xff0c;除了应用层的查询优化和索引优化之外&#xff0c;数据库配置优化 也是非常重…

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

目录 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…

C++ Linux IPC进程通信-消息队列MQ

原文链接&#xff1a;C Linux IPC进程通信-消息队列MQ 消息队列库<sys/msg.h> 相比于共享内存和管道,消息队列能够实现指定的消息格式和排序,能实现更复杂的通信 库函数 // 创建消息队列 int msgget(key_t, key, int msgflg); return ID(成功) -1(错误)key为一个标记…

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…

screen使用——关机时在服务器上跑代码

一、连接服务器 原理:通过 SSH(Secure Shell)协议建立本地与远程服务器的安全连接通道,使得可以在本地操作服务器。 操作:使用 VSCode 或 cmd 的 ssh 连接到服务器,这里我选择cmd。 检查是否安装 OpenSSH 在 Windows 10 及以上版本中,系统可能已经自带 OpenSSH 客户端…

(k8s)Kubernetes部署Promehteus

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

Kubernetes(K8S)实战:构建高可用的微服务架构

Kubernetes(K8S)实战:构建高可用的微服务架构 在云计算与容器化技术日新月异的今天,Kubernetes(简称K8S)凭借其强大的容器编排能力,已成为企业构建云原生应用的首选平台。本文将深入探讨Kubernetes的核心概念、架构设计原则,并通过一个实际案例——构建一个高可用的微…

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]为未…

数据库面试题整理

数据库面试题整理 整理了下常见的有关数据的面试题&#xff0c;持续更新中 1. mysql数据库事务的四个特性&#xff1a; 原子性&#xff08;Atomicity&#xff09;&#xff1a;事务要么做&#xff0c;要么不做一致性&#xff08;Consistency&#xff09;&#xff1a;使数据库从…

Nginx泛域名 解析的匹配前缀绑定或转发到子目录

网站的目录结构为&#xff1a; # tree /home/wwwroot/landui.com /home/wwwroot/landui.com ├── bbs │ └── index.html └── www └── index.html 2 directories, 2 files /home/wwwroot/landui.com为nginx的安装目录下默认的存放源代码的路径。 bbs为论坛…

GPU使用

0. 写这篇文章的背景 最近还是在使用GPU、连接远程服务器上出现了一点问题,发现在这方面的知识还是学得很模糊。(最让人感到困惑的是之前GPU的使用都没有问题) 总结一下最近的问题: 1.每一次连接远程服务器(选择的Ubuntu22.04),使用服务器的文件夹还好(关键是现在用…

YARN性能优化高频面试题及答案

目录 高频面试题及答案1. 什么是YARN?它在Hadoop生态系统中的作用是什么?2. 如何通过合理配置`Container`大小来优化YARN性能?3. 如何通过调整`ResourceManager`的调度策略优化YARN性能?4. 如何优化YARN中`ResourceManager`和`NodeManager`的内存配置?5. 如何通过调节`Map…

【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:/…