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

news2024/9/23 6:27:18

一. 概述

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);

    // 将元素复制到 vector
    vector<int> vec;
    while (!q.empty()) {
        vec.push_back(q.front());
        q.pop();
    }

    // 遍历 vector
    for (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.coloradmin.cn/o/2156868.html

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

相关文章

论前端框架的对比和选择 依据 前端框架的误区

前端框架的对比和选择依据 在前端开发中&#xff0c;有多种框架可供选择&#xff0c;以下是一些常见前端框架的对比和选择依据&#xff1a; 一、Vue.js 特点&#xff1a; 渐进式框架&#xff0c;灵活度高&#xff0c;可以逐步引入到项目中。学习曲线相对较平缓&#xff0c;容…

Java项目实战II基于Java+Spring Boot+MySQL的民宿在线预定平台(开发文档+源码+数据库)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 在旅游市场…

强大的重命名工具 | Bulk Rename Utility v4.0 便携版

软件简介 Bulk Rename Utility是一款功能强大且易于使用的文件批量重命名工具。它不仅体积小巧&#xff0c;而且完全免费&#xff0c;提供了友好的用户界面。该软件允许用户对文件或文件夹进行批量重命名&#xff0c;支持递归操作&#xff0c;即包含子文件夹的重命名。 软件特…

Apache Iceberg 概述

Apache Iceberg概述 一、what is Apache Iceberg&#xff1f; 为了解决数据存储和计算引擎之间的适配的问题&#xff0c;Netflix开发了Iceberg&#xff0c;2018年11月16日进入Apache孵化器&#xff0c;2020 年5月19日从孵化器毕业&#xff0c;成为Apache的顶级项目。 Apache…

SpringBoot实战(三十)发送HTTP/HTTPS请求的五种实现方式【下篇】(Okhttp3、RestTemplate、Hutool)

目录 一、五种实现方式对比结果二、Demo接口地址实现方式三、Okhttp3 库实现3.1 简介3.2 Maven依赖3.3 配置文件3.4 配置类3.5 工具类3.6 示例代码3.7 执行结果实现方式四、Spring 的 RestTemplate 实现4.1 简介4.2 Maven依赖4.3 配置文件4.4 配置类4.5 HttpClient 和 RestTemp…

华为HarmonyOS灵活高效的消息推送服务(Push Kit) - 5 发送通知消息

场景介绍 通知消息通过Push Kit通道直接下发&#xff0c;可在终端设备的通知中心、锁屏、横幅等展示&#xff0c;用户点击后拉起应用。您可以通过设置通知消息样式来吸引用户。 开通权益 Push Kit根据消息内容&#xff0c;将通知消息分类为服务与通讯、资讯营销两大类别&…

idea2021git从dev分支合并到主分支master

1、新建分支 新建一个名称为dev的分支&#xff0c;切换到该分支下面&#xff0c;输入新内容 提交代码到dev分支的仓库 2、切换分支 切换到主分支&#xff0c;因为刚刚提交的分支在dev环境&#xff0c;所以master是没有 3、合并分支 点击push&#xff0c;将dev里面的代码合并到…

Spring AI Alibaba,阿里的AI Java 开发框架

源码地址 https://github.com/alibaba/spring-ai-alibaba

资源创建方式-Job

Job: 容器按照持续运行的时间可分为两类&#xff0c;服务类容器&#xff0c;和工作类容器 服务类容器通常持续提供服务&#xff0c;需要一直运行&#xff0c;比如HTTP,Server&#xff0c;Daemon等&#xff0c; 工作类容器则是一次性任务&#xff0c;比如批处理程序&#xff0…

跟着问题学12——GRU详解

1 GRU 1. 什么是GRU GRU&#xff08;Gate Recurrent Unit&#xff09;是循环神经网络&#xff08;Recurrent Neural Network, RNN&#xff09;的一种。和LSTM&#xff08;Long-Short Term Memory&#xff09;一样&#xff0c;也是为了解决长期记忆 和反向传播中的梯度等问题…

数据集-目标检测系列-吸烟检测数据集 smoking cigarette >> DataBall

数据集-目标检测系列-吸烟检测数据集 smoking cigarette >> DataBall 数据集-目标检测系列-吸烟检测数据集 &#xff08;smoking cigarette&#xff09; 数据量&#xff1a;1W 想要进一步了解&#xff0c;请联系 DataBall。 DataBall 助力快速掌握数据集的信息和使用方…

闯关leetcode——67. Add Binary

大纲 题目地址内容 解题代码地址 题目 地址 https://leetcode.com/problems/add-binary/description/ 内容 Given two binary strings a and b, return their sum as a binary string. Example 1: Input: a “11”, b “1” Output: “100” Example 2: Input: a “101…

Qt系统相关——事件

文章目录 事件和信号槽的关系事件处理鼠标事件鼠标进入和离开鼠标点击获取位置鼠标释放鼠标双击鼠标移动鼠标滚轮 键盘事件定时器事件窗口移动和窗口改变 事件和信号槽的关系 Qt信号槽机制&#xff1a; 用户进行的操作就可能产生信号&#xff0c;可以给某个信号指定槽函数&…

Effective Java 学习笔记 如何为方法编写文档

目录 方法的文档注解设计的原则 Javadoc常用的文档注释 一些注意细节 通过Javadoc命令生成h5页面 这是第8章Java方法的最后一部分&#xff0c;聚焦为导出的API编写文档注释。 如果要想使得API真正可用&#xff0c;配套的文档是必须的。Java提供了Javadoc这个文档生成工具&…

Renesas R7FA8D1BH (Cortex®-M85)的 General PWM的应用实践

目录 概述 1 General PWM介绍 1.1 特性 1.2 定时器选择注意点 2 时钟配置 3 应用案例 3.1 基本定时器应用 3.2 定时器回调函数案例 3.3 输入捕捉功能案例 3.4 更新周期案例 3.5 更新占空比案例 3.6 单次触发脉冲案例 4 测试 4.1 代码介绍 4.2 验证 概述 本文主…

基于SpringBoot+Vue+MySQL的特色旅游网站系统

系统展示 用户前台界面 管理员后台界面 系统背景 随着旅游业的蓬勃发展&#xff0c;人们对旅游体验的需求日益多样化与个性化。传统的旅游信息查询与预订方式已难以满足现代游客的需求。因此&#xff0c;我们开发了这款基于SpringBootVueMySQL的特色旅游网站系统。该系统旨在通…

HTML实现的简单网站首页模板

这个是简单的网站首页模板&#xff0c;用于学习或者参考 实现代码: <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"&…

移动硬盘‘需格式化‘困境:原因剖析、恢复策略与预防之道

困境直击&#xff1a;移动硬盘为何需格式化才能访问&#xff1f; 在数字化时代&#xff0c;移动硬盘作为数据存储与传输的重要工具&#xff0c;其稳定性与可靠性直接关系到用户数据的安全。然而&#xff0c;不少用户在使用过程中遭遇了“移动硬盘需要格式化才能打开”的尴尬境…

Qt_对话框QDialog的介绍

目录 1、新建项目对话框 2、非模态对话框 3、模态对话框 4、自定义对话框 5、Qt内置对话框 5.1 消息对话框QMessageBox 5.2 颜色对话框QColorDialog 5.3 文件对话框QFileDialog 5.4 字体对话框QFontDialog 5.5 输入对话框QInputDialog 结语 前言: 在Qt中&…

布草洗涤必备4张表-———未来之窗行业应用跨平台架构

一、洗涤厂客户月度报表 二、大酒店楼层布草月度统计报表 三、职员月度报表 四、司机当日统计报表 五、阿雪技术观 拥抱开源与共享&#xff0c;见证科技进步奇迹&#xff0c;畅享人类幸福时光&#xff01; 让我们积极投身于技术共享的浪潮中&#xff0c;不仅仅是作为受益者&a…