0

0

c++中如何使用deque双端队列_c++ STL容器deque操作【精讲】

尼克

尼克

发布时间:2026-03-10 11:31:49

|

208人浏览过

|

来源于php中文网

原创

是的,push_front 和 push_back 平均时间复杂度都是 o(1),依赖分段连续内存结构,扩容不拷贝元素,摊还稳定;但控制数组可能持续增长,内存占用偏高,且内存不连续,不可用于要求连续内存的场景。

c++中如何使用deque双端队列_c++ stl容器deque操作【精讲】

deque 的 push_front 和 push_back 性能真的都 O(1) 吗?

是的,push_frontpush_back 平均时间复杂度都是 O(1),但背后依赖分段连续内存结构。实际中,当当前段满时,deque 会分配新段并更新控制数组,这个过程不触发元素拷贝(区别于 vector 的扩容),所以摊还代价稳定。

容易踩的坑:

  • 频繁在首尾交替插入(比如模拟滑动窗口不断 push_frontpop_back)时,控制数组可能持续增长,虽不慢,但内存占用比预期高
  • 不要假设 deque 的内存是真正连续的——&dq[0] + 1 不一定等于 &dq[1],因此不能把 dq.data() 当作 C 风格数组传给需要连续内存的函数(如某些 SIMD 接口或 fwrite

迭代器失效规则和 vector 有什么不同?

deque 迭代器只在对应位置被擦除(erase)或整个容器被销毁时才失效;插入操作(push_front/push_back/insert)**不会使其他迭代器失效**——这点和 vector 完全相反。

使用场景举例:你正在遍历 deque 做条件判断,同时需要把满足条件的元素加到队首,这时可以直接边 push_front 边用原迭代器继续走,完全不用担心失效。

立即学习C++免费学习笔记(深入)”;

注意点:

Beautiful.ai
Beautiful.ai

AI在线创建幻灯片

下载
  • erase(iterator) 会令该迭代器及之后所有迭代器失效(但不是全部失效,仅从该位置起向后失效)
  • clear() 后所有迭代器立即失效
  • 避免对 end() 迭代器做自增(++it),虽然 deque 允许,但行为未定义,别依赖

用 deque 实现栈和队列,为什么比手写链表更合适?

因为 deque 提供了 push_back/pop_back(栈)和 push_back/pop_front(队列)的组合,且所有操作都是摊还 O(1),没有指针管理开销,也不像 list 那样每节点多占 2 个指针内存。

实操建议:

  • 别用 stack<int deque>></int> 显式指定底层容器——默认就是 deque,stack<int></int> 足够
  • 如果队列操作中需要随机访问第 k 个元素(比如优先级调整),deque 比 queue<int></int>(默认基于 deque)更直接,因为可写 q[k]
  • 不要为了“看起来像队列”而封装一层类再暴露 push/pop——直接用 deque 成员函数更清晰、更少出错

resize() 和 assign() 对 deque 来说意味着什么?

resize(n) 会保留前 min(n, size()) 个元素,不足补默认值,超出则截断;assign(n, val) 则清空后重新填入 n 个 val。两者都会导致原有元素被析构、新元素被构造。

关键差异:

  • resize(0) 等价于 clear(),但不保证释放内存(capacity 不变);想真正释放内存得用 deque<t>{}.swap(dq)</t>
  • assign 在参数为迭代器范围时(如 assign(v.begin(), v.end()))效率很高,内部按需分配段,不逐个 insert
  • 若元素类型有非平凡析构函数,resize 缩小时会调用对应数量的析构函数——这点常被忽略,尤其在嵌套容器场景下容易引发意外性能抖动

复杂点在于:deque 的“容量”概念模糊,没有 capacity() 成员函数,也没法像 vector 那样预估内存用量。如果你真需要控制内存段数量,只能靠观察 size() 和实际分配行为,或者换用 vector + 手动维护双端逻辑。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

990

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

607

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

314

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

235

2025.08.29

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1878

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

656

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2382

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

47

2026.01.19

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

24

2026.03.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 11万人学习

C 教程
C 教程

共75课时 | 5.3万人学习

C++教程
C++教程

共115课时 | 21.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号