std::deque(双端队列)

std::deque(双端队列)是 C++ 标准模板库(STL)中的一个序列容器,它提供了在队列的两端进行插入和删除操作的高效实现。std::deque 可以被视为一个固定大小的数组,但它可以动态增长和缩减,且不需要在每次插入或删除时重新分配整个数组的内存。

std::deque 的主要特点包括:

  1. 两端快速访问:可以在 std::deque 的前端和后端快速添加或移除元素。
  2. 动态大小std::deque 的大小可以根据需要动态增长和缩减。
  3. 内存效率std::deque 通常使用多个固定大小的块来存储元素,这有助于减少内存碎片并提高内存访问效率。
  4. 无容量限制:与 std::vector 不同,std::deque 没有容量限制,它可以根据需要增长到任何大小(受限于可用内存)。

下面是一些使用 std::deque 的基本示例:

创建和初始化 std::deque

#include <deque>
#include <iostream>int main() {// 创建一个空的 dequestd::deque<int> deq1;// 使用花括号初始化 dequestd::deque<int> deq2 = {1, 2, 3, 4, 5};// 使用另一个 deque 的拷贝初始化std::deque<int> deq3(deq2);return 0;
}

插入和删除元素

#include <deque>
#include <iostream>int main() {std::deque<int> deq = {1, 2, 3, 4, 5};// 在 deque 的前端插入元素deq.push_front(0);   // {0,1,2,3,4,5}// 在 deque 的后端插入元素deq.push_back(6);   // {0,1,2,3,4,5,6}// 从 deque 的前端移除元素deq.pop_front();   // {1,2,3,4,5,6}// 从 deque 的后端移除元素deq.pop_back();   // {1,2,3,4,5}// 打印 deque 的内容for (int num : deq) {std::cout << num << " ";}std::cout << std::endl;return 0;
}

访问元素

std::deque 提供了 front()back() 方法来访问第一个和最后一个元素,但没有直接访问中间元素的方法。要访问中间元素,需要一个指向中间的迭代器,通常通过 begin()end()find() 等方法获得。

#include <deque>
#include <iostream>int main() {std::deque<int> deq = {1, 2, 3, 4, 5};// 访问第一个元素std::cout << "Front element: " << deq.front() << std::endl;// 访问最后一个元素std::cout << "Back element: " << deq.back() << std::endl;// 使用迭代器访问中间元素auto it = deq.begin() + 2; // 获取指向第三个元素的迭代器if (it != deq.end()) {std::cout << "Middle element: " << *it << std::endl;}return 0;
}

遍历 std::deque

可以使用迭代器或范围 for 循环来遍历 std::deque 中的所有元素。

容量和大小

std::deque 提供了 empty()size()max_size() 方法来查询容器的状态。

#include <deque>
#include <iostream>int main() {std::deque<int> deq;// 检查 deque 是否为空if (deq.empty()) {std::cout << "Deque is empty." << std::endl;}// 获取 deque 的大小std::cout << "Deque size: " << deq.size() << std::endl;// 获取 deque 可以容纳的最大元素数量std::cout << "Deque max size: " << deq.max_size() << std::endl;return 0;
}

std::deque 是一个非常有用的容器,特别是需要在序列的两端频繁地插入和删除元素时。然而,由于它的内部实现使用了几个固定大小的块,所以当插入或删除操作跨越块的边界时,可能会发生额外的内存分配和元素复制,这可能会导致性能开销。因此,在决定使用 std::deque 时,需要根据具体的应用场景来权衡其优缺点。


使用 std::deque 实现单调队列是一种常见的做法,因为它支持两端的快速插入和删除操作。单调队列通常用于维护一个区间内的最小值或最大值,例如在处理滑动窗口问题时。下面是使用 std::deque 实现一个单调递增队列的示例,它可以用于计算滑动窗口的最大值:

#include <iostream>
#include <deque>class MonotonicQueue {
private:std::deque<int> dq; // 使用双端队列实现单调队列public:// 向队列尾部添加元素void push(int value) {// 移除所有比新值小的尾部元素(保持队列单调性)while (!dq.empty() && dq.back() < value) {dq.pop_back();}// 将新值添加到队列尾部dq.push_back(value);}// 移除队列头部的元素void pop_front() {// 只移除队列头部的元素if (!dq.empty()) {dq.pop_front();}}// 获取队列头部的元素int front() {if (dq.empty()) {throw std::out_of_range("Queue is empty.");}return dq.front();}// 获取队列尾部的元素int back() {if (dq.empty()) {throw std::out_of_range("Queue is empty.");}return dq.back();}// 检查队列是否为空bool empty() {return dq.empty();}// 获取队列的大小size_t size() {return dq.size();}
};int main() {MonotonicQueue mq;mq.push(5);mq.push(3);mq.push(7);mq.push(4);mq.push(6);while (!mq.empty()) {std::cout << mq.front() << " ";mq.pop_front();}std::cout << std::endl;return 0;
}

LC239

class Solution {
public:vector<int> maxSlidingWindow(vector<int>& nums, int k) {vector<int> res;deque<int> q;for (int i = 0; i < nums.size(); i++) {// 严格维持单调递减while (!q.empty() && nums[i] > nums[q.back()]) q.pop_back();q.push_back(i);if (i-q.front() >= k) q.pop_front();if (i >= k-1) res.emplace_back(nums[q.front()]);} return res;}
};

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

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

相关文章

关于oracle切换mysql8总结

最近由于项目换库&#xff0c;特此记录 1.字段类型 number(8) -> int(8) number(16) -> bigint(16) varchar2() -> varchar() 2.导数据 从oracle迁移数据到mysql&#xff0c;除了用专门的数据泵&#xff0c;经常需要用csv导入到mysql&#xff1b; 导出的csv数据如果…

【bugfix】如何解决svg到线上显示空白或者svg的viewBox为空

svgo的默认机制是当width和height和viewbox一样会删除viewbox&#xff0c;这都是为了svg的压缩做的&#xff0c;详情可以看issue中的讨论&#xff0c;我们可以通过更改babel的配置来解决 https://github.com/svg/svgo/issues/1128 https://github.com/ant-design/ant-design-we…

WebSocket用户验证

在WebSocket中&#xff0c;如何携带用户的验证信息 一、在OnMessage中进行验证 客户端在连接到服务器后&#xff0c;客户端通过发送消息&#xff0c;服务器端在OnMessage方法中&#xff0c;进行信息验证&#xff0c;这种方式需要将用户身份验证及接收用户消息进行混合处理&am…

Python人工智能:推动气象科学研究与技术进步的新动力

Python是功能强大、免费、开源&#xff0c;实现面向对象的编程语言&#xff0c;在数据处理、科学计算、数学建模、数据挖掘和数据可视化方面具备优异的性能&#xff0c;这些优势使得Python在气象、海洋、地理、气候、水文和生态等地学领域的科研和工程项目中得到广泛应用。可以…

竞赛常考的知识点大总结(七)图论

最短路 最短路问题&#xff08;Shortest Path Problem&#xff09;是图论中的一个经典问题&#xff0c;它要求在给定的图中找到两个顶点之间的最短路径。最短路问题可以是单源最短路问题&#xff08;从一个顶点到其他所有顶点的最短路径&#xff09;或所有对最短路问题&#x…

Oracle 数据库中的全文搜索

Oracle 数据库中的全文搜索 0. 引言1. 整体流程2. 创建索引2-1. 创建一个简单的表2-2. 创建文本索引2-3. 查看创建的基础表 3. 运行查询3-1. 运行文本查询3-2. CONTAINS 运算符3-3. 混合查询3-4. OR 查询3-5. 通配符3-6. 短语搜索3-7. 模糊搜索&#xff08;Fuzzy searches&…

详细解释Javaweb、Spring和Spring Boot对数据库的使用

在传统的Javaweb中&#xff0c;对数据库进行访问通常使用JDBC&#xff08;Java Database Connectivity&#xff09;来实现。以下是一个简单的示例&#xff0c;演示如何使用JDBC连接数据库并执行查询操作&#xff1a; java import java.sql.Connection; import java.sql.Drive…

2021-08-06

yarn的简介&#xff1a; Yarn是facebook发布的一款取代npm的包管理工具。 yarn的特点&#xff1a; 速度超快。 Yarn 缓存了每个下载过的包&#xff0c;所以再次使用时无需重复下载。 同时利用并行下载以最大化资源利用率&#xff0c;因此安装速度更快。超级安全。 在执行代码…

ChatGPT技巧分享:如何用AI提升学术写作水平

ChatGPT无限次数:点击直达 ChatGPT技巧分享&#xff1a;如何用AI提升学术写作水平 在当今信息爆炸的时代&#xff0c;学术写作是一个重要的技能&#xff0c;但如何提高自己的学术写作水平呢&#xff1f;AI技术的发展为我们提供了更多可能&#xff0c;其中ChatGPT作为一种强大的…

Redis性能瓶颈与安全隐患排查验证纪实

在写《Redis怎样保证数据安全&#xff1f;》这篇文章&#xff0c;我是有对redis设置密码需要哪些步骤&#xff0c;设置密码的性能损耗有验证的。这就涉及到要对redis的配置做修改。 开始时我是打算采用直接使用redis配置文件的方式。所以我从redis官网下载了一个默认的配置文件…

ROS 2边学边练(9)-- 用launch命令管理启动项

概念 我们在前面的ROS 2体验过程中&#xff0c;一直拿小海龟这个例子来练手&#xff0c;过程比较轻松&#xff0c;因为只有两个节点&#xff08;/turtlesim和/teleop_turtle&#xff09;&#xff0c;只需打开两个终端&#xff0c;ros2 run 节点就ok&#xff0c;但&#xff0c;现…

Datacom HCIP笔记-ISIS协议

IS中间系统&#xff08;路由器/运行了ISIS协议的设备&#xff09; ES终端系统(PC,PAD,print) 网络功能模型 ISO定义 事实标准 OSI TCP/IP 网络层(CLNP) (IS-IS) 网络…

EfficientVMamba实战:使用EfficientVMamba实现图像分类任务(一)

文章目录 摘要安装包安装timm 数据增强Cutout和MixupEMA项目结构编译安装Vim环境环境安装过程安装库文件 计算mean和std生成数据集 摘要 论文&#xff1a;https://arxiv.org/pdf/2401.09417v1.pdf 作者研究了轻量级模型设计的新方法&#xff0c;通过引入视觉状态空间模型&…

每天学习一个Linux命令之wget

每天学习一个Linux命令之wget 简介 在Linux系统中&#xff0c;wget是一个使用非常广泛的命令行工具&#xff0c;用于从网络上下载文件。无论是从简单的文件下载&#xff0c;还是通过递归下载整个网站&#xff0c;wget都能帮助你完成。本文将详细介绍wget命令的用法及其可用的…

Git、TortoiseGit、SVN、TortoiseSVN 的关系和区别

Git、TortoiseGit、SVN、TortoiseSVN 的关系和区别 &#xff08;二&#xff09;Git&#xff08;分布式版本控制系统&#xff09;:&#xff08;二&#xff09;SVN&#xff08;集中式版本控制系统&#xff09;&#xff08;三&#xff09;TortoiseGit一、下载安装 git二、安装过程…

python如何处理文本错误

在python中&#xff0c;如果读取的文本文件不在程序的目录中&#xff0c;会提示FileNotFoundError 如果不能确定文本文件是否在目录中&#xff0c;可以用try except语句 代码如下 from pathlib import PathpathPath(alice.txt) try:contentspath.read_text(encodingutf_8) e…

Tomcat调优总结

Tomcat自身的调优是针对conf/server.xml中的几个参数的调优设置。首先是对这几个参数的含义要有深刻而清楚的理解。以tomcat8.5为例&#xff0c;讲解参数。 同时也得认识到一点&#xff0c;tomcat调优也受制于linux内核。linux内核对tcp连接也有几个参数可以调优。 因此可以将…

【C/C++】C语言实现串

C语言实现字符串 简单描述代码运行结果 简单描述 用codeblocks编译通过 源码参考连接 https://gitee.com/IUuaena/data-structures-c.git 代码 guistar_string.h #ifndef GUISTAR_STRING_H_INCLUDED #define GUISTAR_STRING_H_INCLUDED/*! brief 函数返回值枚举 */ typedef e…

scala实现通过Spark统计人均登录次数最终写入MySQL

谨以此博客作为记录 小编这里用的版本是&#xff1a; <hadoop.version>2.7.7</hadoop.version> <spark.version>2.4.5</spark.version> <scala.version>2.12.10</scala.version> 如果没用到Hadoop可以忽略 步骤 准备数据&#xff0c;知道…

C++面向对象程序设计 - 访问对象中成员的3种方法

在C程序中访问对象的成员变量和成员函数&#xff0c;有三种方法&#xff1a; 通过对象名和成员运算符访问对象中的成员&#xff1b;通过指向对象的指针访问对象中的成员&#xff1b;通过对象的引用变量访问对象中的成员 在了解访问对象中成员的3种方法前&#xff0c;先了解下C…