stl里的deque 中控map 假如用完了,该如何处理

STL源码剖析——序列容器之deque 前言 阅读详情

在 C++ 的标准模板库(STL)中,std::deque(双端队列)使用一种分段连续的存储结构,通过一个中控器(通常称为中控 map)来管理多个固定大小的存储块(缓冲区)。当这个中控 map 用完时,std::deque 会进行扩容操作,下面详细介绍其处理过程。

1. std::deque 中控 map 简介

  • 中控 map 本质上是一个动态数组,数组中的每个元素是一个指针,这些指针分别指向不同的存储块(缓冲区)。每个存储块是一段连续的内存,用于实际存储 deque 中的元素。
  • 当需要向 deque 中添加元素,而现有的存储块空间不足时,会创建新的存储块,并将其地址记录在中控 map 中。

2. 中控 map 用完后的处理步骤

步骤 1:分配更大的中控 map

当现有的中控 map 空间不足时,std::deque 会分配一个更大的中控 map。通常,新的中控 map 大小会比原来的大,一般是原来的两倍。

步骤 2:复制原中控 map 内容

将原中控 map 中的指针复制到新的中控 map 中,这些指针指向的存储块(缓冲区)保持不变。

步骤 3:释放原中控 map

释放原中控 map 所占用的内存,避免内存泄漏。

步骤 4:更新内部指针

更新 deque 内部的指针,使其指向新的中控 map。

3. 示例代码及模拟解释

虽然标准库的具体实现细节因编译器而异,但可以通过一个简化的示例来模拟这个过程:

#include <iostream>
#include <deque>

// 模拟 std::deque 中控 map 扩容的简化函数
template<typename T>
void simulate_deque_map_expansion(std::deque<T>& dq) {
    // 这里只是模拟,标准库中不会直接暴露这些细节
    // 假设原中控 map 用完了,需要扩容

    // 步骤 1: 分配更大的中控 map
    // 新的中控 map 大小假设为原来的两倍
    // 这里只是示意,实际实现更复杂
    size_t new_map_size = 2 * /* 原中控 map 大小 */;
    // 分配新的中控 map 内存(模拟)
    // void** new_map = new void*[new_map_size];

    // 步骤 2: 复制原中控 map 内容
    // 遍历原中控 map,将指针复制到新的中控 map 中
    // for (size_t i = 0; i < /* 原中控 map 大小 */; ++i) {
    //     new_map[i] = /* 原中控 map[i] */;
    // }

    // 步骤 3: 释放原中控 map
    // delete[] /* 原中控 map */;

    // 步骤 4: 更新内部指针
    // dq 内部指针指向新的中控 map(模拟)
    // dq.set_map(new_map);

    std::cout << "中控 map 已扩容" << std::endl;
}

int main() {
    std::deque<int> dq;
    // 模拟添加大量元素导致中控 map 用完
    for (int i = 0; i < 10000; ++i) {
        dq.push_back(i);
    }

    // 模拟中控 map 扩容
    simulate_deque_map_expansion(dq);

    return 0;
}

4. 注意事项

  • 性能开销:中控 map 的扩容操作涉及内存分配、数据复制和释放,会带来一定的性能开销。因此,在使用 std::deque 时,如果能预估元素数量,可以提前调用 reserve 函数来预留足够的空间,减少扩容次数。
  • 迭代器和引用失效:中控 map 扩容后,deque 的迭代器和引用可能会失效,需要特别注意。

总之,当 std::deque 的中控 map 用完时,会自动进行扩容操作,以保证 deque 能够继续存储更多的元素。

STL源码剖析——deque的实现原理和使用方法详解 Deque 简介     deque是“double—ended queue”的缩写,和vector一样都是STL的容器,deque 是双端数组,而 vector 是单端的。     deque 在接口上和 vector 非常相似,在许多操作的地方可以直接替换。     deque 可以随机存取元素(支持索引值直接存取,用[]操作符或at()方法,这个等下会详讲)。     deque 头 阅读详情

相关推荐

【STL源码剖析】第四章 序列式容器 之 deque底层实现

dequedeque概述vector是单向开口的连续线性空间,deque则是一种双向开口的连续线性空间。所谓双向开口,意思是可以在头尾两端分别做元素的插入和删除操所。vector当然也可以在头尾端进行操作(从技术观点),但是其从头部操作效率奇差,无法被接受。deque和vector的最大差异,一在于deque允许常数时间内对起头端进行元素的插入或移除操作,二在于deque没有所谓的容量概念,因为它...

stt2019 6875

【STL源码剖析】从源码看 deque :拆解双端队列的底层实现与核心逻辑

本文深入剖析了STL中deque的实现原理,主要面向熟悉STL底层机制的开发者。本文对比了vector和deque的结构差异,deque通过分段连续空间实现高效双向操作。重点解析了deque的两大核心组件:中控器(指针数组)负责管理各段空间,迭代器通过复杂设计维持++/--操作;解析deque整体连续的假象。详细介绍了迭代器的关键成员变量和跨越缓冲区的移动策略,包括++/--操作时的边界处理。通过源码分析展示了deque如何实现高效的内存管理和元素访问,为深入理解STL底层机制提供了宝贵参考。

2401_87944878的博客 2万+

C++STL库的 deque、stack、queue、list、set/multiset、map/multimap

Deque 最大的工作就是维护这些分段连续的内存空间的整体性的假象,并提供随 机存取的接口,避开了重新配置空间,复制,释放的轮回,代价就是复杂的迭代器架构。拥有相同的某些性质,当对它的容器元素进行新增操作或者删除操作 时,操作之前的所有迭代器,在操作完成之后依然有效,当然被删除的那个元素的迭代器必然是个例外。某些相同的性质,当对容器中的元素进行插入操作或者删除操作的 时候,操作之前所有的迭代器,在操作完成之后依然有效,被删除的那个元素的迭代器必然是一个例外。对于空间的运用有绝对的精准,一点也不浪费。

weixin_50963877的博客 1984

【C++ STL】deque结构和迭代器

摘要: deque是STL中结合vector随机访问和list高效增删特性的双向开口容器。其核心数据结构通过中控器(map)管理多段连续空间,实现逻辑上的连续性。迭代器设计复杂,需维护当前数据位置、缓冲区边界及中控节点信息,支持随机访问但效率略低于vector。deque两端插入/删除高效,中间操作需移动元素,性能优于vector但不及list。空间动态增长时仅需调整中控器指针,避免vector式的大规模数据拷贝。

2403_88316985的博客 1229

STL浅析 deque

vector是单向开口的连续线性空间,deque是双向开口的连续线性空间。 所谓双向开口,就是可以在头尾两端做插入和删除。 虽然vector在头部做插入和删除也可以实现,但效率很差,因为会不断的移动整个数组。 而deque在头部的插入和删除是O(1)的时间复杂度。 deque和vector的差异 1.deque允许在O(1)时间复杂度内对头部进行插入和删除。 2.deque没有容量的概念,因为它是...

q435201823的博客 395

STL常用API(vector、list、deque、map、set、queue、stack、algorithm)

本文用于总结STL常用API!!!本文代码已经上传到github中。 1. STL(标准模板库) STL提供了一组表示容器、迭代器、函数对象和算法的组件。容器是用来存储若干个类型相同的值;迭代器用来遍历容器;函数对象是类似于函数的对象;算法是完成特定任务的方法。该库包含了诸多在计算机科学领域里所常用的基本数据结构和基本算法。 2. 容器的种类? (本文图片来源于博客:https...

attitude_yu 2112

深入解剖STL deque:从源码剖析到容器适配器实现

✨本文深入剖析STL deque的底层实现原理,详细讲解其三层架构设计:中控器(map)、缓冲区(buffer)和复杂迭代器。通过源码分析揭示了deque如何实现头尾O(1)时间复杂度的插入删除操作,以及维护"整体连续"假象的技术细节。进一步探讨了基于deque的容器适配器实现,包括queue和priority_queue的设计原理与性能特点。文章最后提供各容器选型建议,帮助读者在实际开发中做出合理选择。掌握这些知识对于深入理解STL设计哲学和编写高效C++代码具有重要意义。

燃于AC之乐的博客 1319

STL学习--deque

简介 deque是一种双向开口的连续空间,可以在头尾两端进行添加和删除操作。不同与vector的是deque是一段段的连续空间,这些连续空间由中控器map(不是stlmap)管理, 以提供一种类似的连续性。缓冲区大小为512。 中控管理图: 特性 deque两端都可以快速的插入和删除元素 deque可以进行随机存取,但存取速度比vector慢 面试题 1.

保持住思维的鲜活,才能充满活力。 1091

STL之deque

STL:: deque 一. deque简介 双端队列deque,与vector的最大差异在于: 一、deque运行常数时间对头端或尾端进行元素的插入和删除操作。 二、deque没有所谓的容器概念,因为它是动态地以分段连续空间组合而成随时可以增加一块新的内存空间并拼接起来。 虽然deque也提供随机访问的迭代器,但它的迭代器与list和vector的不一样,其设计相当复杂而精妙。因此,会对各种运算产生一定影响,厨房必要,尽可能的选择使用vetor而非deque。 二. deque核心类别设计(部分) 三.

Nwk0000000001的博客 2027

C++ STL顺序容器 —— deque底层实现原理剖析

概述 、deque的中控器 、迭代器 、数据结构 、构造与内存管理 、元素操作

ZY-JIMMY 4955

【STL源码剖析】deque 的使用

deque是有下标顺序容器,它允许在其首尾两段快速插入及删除。另外,在任一端插入或删除不会非法化指向其余元素的指针或引用。是一块连续的空间(至少逻辑看来如此),连续空间我们可能会想到(数组)或者。无法成长,虽然可以成长但是只有尾端成长,而且扩容(成长)只是假象,实际上是:另寻更大的空间、将原资料拷贝过去、释放原空间。这样的话成长所带来的代价是相当高的。的想象结构:就是相同的连续空间拼接而成而巧妙的避开了的缺点,

2301_79201049的博客 1291

STL中的deque(双端队列),存储结构与使用

STL中的deque(双端队列),存储结构与使用

sgbscx的博客 1122

【冷冻电镜】RELION5.0使用教程总结

对于您自己的数据,您可能希望使用各种倾斜系列对齐方法,然后比较每种方法生成的断层扫描图像的质量(参见下一步)。通过检查 CtfFind job 的 tilt_series 目录中的star文件来检查几个倾斜系列的散焦值。GitHub上也有人反应这个问题,目前我的解决方案是下载了较低版本的CTFFIND的,降级到4.1.10可以成功运行。此外,logfile.pdf 文件包含所有显微照片的有用参数图,例如散焦、像散、估计分辨率等,以及整个数据集中这些值的直方图。的目录,以及指向此目录的符号链接。

进阶中的程序员吃吃的博客 4220

【STL】deque的实现原理

文章目录

qq_43142509的博客 1886

40-基于STM32与LD3320的智能语音调光台灯开发全攻略(代码+硬件+调试心得)

本文详细介绍了基于STM32与LD3320的智能语音调光台灯开发全攻略,包括硬件设计、软件实现和调试心得。项目利用STM32单片机控制LD3320语音识别模块,实现语音控制开关和PWM调光功能,适合非接触式操作场景。文章还分享了硬件选型、PWM调光算法优化及常见问题解决方案,为开发者提供完整参考。

weixin_29163797的博客 324

5分钟搞懂Paris公式:如何用裂纹扩展速率预测零件寿命(附Python代码示例)

本文详细介绍了Paris公式在裂纹扩展速率预测零件寿命中的应用,通过Python代码示例展示了从理论到实践的完整流程。文章涵盖了Paris公式的工程本质、寿命预测计算流程、几何修正因子选择以及实际案例演示,帮助工程师快速掌握这一关键技术。

weixin_29309475的博客 426

STL中deque详解

主流的STL容器的数据结构都比较常规,类似List就是实现了链表的数据结构,数据以一个node接连串接一个node的形式存储;vector则是一个连续空间存储的变长数组,当空间用完后则申请一倍的空间并老数据拷贝到新分配空间中;map和set则是红黑树,一种特殊的二叉平衡搜索树,保证根到叶节点最大的层数差距在两倍以内,以此保证搜索的速度和维护树结构的性能平衡;unordered_map和unorde...

liu3612162的博客 992

html2canvas 返回的toDataURL()数据为 data:,的解决方法

html2canvas 返回的toDataURL()数据为 data:,的解决方法 我在使用html2canvas的使用, 发现toDataURL() 返回的数据为data:, 而且将数据设置为img的src属性,图片也不能正常显示,我尝试了很多方法,也没有解决出来,经过我不断的百度+自己尝试,终于解决了这个问题。 代码: 这段代码是没有任何问题的,标准html2canvas的demod代码,但就是无法正常将图片previewImg 渲染出来,dataURL 我打印的结果为 data:, 错误的原因是,

java123_PB的博客 5024

STL之容器deque

STL之容器deque

Serven的博客 1万+

从零到一:DETR模型在自定义数据集上的实战部署与调优

本文详细介绍了DETR模型在自定义数据集上的实战部署与调优过程,包括环境准备、数据转换、模型配置、训练技巧及问题排查。通过具体代码示例和实用建议,帮助开发者高效完成从零到一的DETR模型部署,特别适合目标检测领域的实践应用。

weixin_42524100的博客 461

[Dify] 如何构建一个带评分功能的 Dify AI 教练系统

本文介绍如何利用Dify开源平台构建具备自动评分功能的AI教练系统。系统通过Prompt设计AI教练角色,使用OpenAPI定义评分工具接口,结合工作流编排实现提问、回答收集、评分和反馈的全流程。文章详细讲解了从AI教练身份设定、多维度评分标准设计到前端可视化展示的实现方法,并提供了可扩展建议,适用于语言训练、面试模拟等多种场景。该系统展示了Dify平台在构建智能化评估应用方面的优势,实现零代码开发专业AI教练解决方案。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 332

STL用法总结(二)(deque,map,set)

映射类似于函数的对应关系,每个x对应一个y,而map是每个键对应一个值。//头文件//初始化定义//node是结构体类型map特性:map会按照键的顺序从小到大自动排序,键的类型必须可以比较大小set容器中的元素不会重复,当插入集合中已有的元素时,并不会插入进去,而且set容器里的元素自动从小到大排序。即:set里面的元素不重复 且有序//头文件//初始化定义set s;代码含义s.begin()返回set第一个元素地址(迭代器)s.end()

2301_80304432的博客 1737

【数据集】中国区域地面气象要素驱动数据集(CMFD)2.0

中国区域地面气象要素驱动数据集(CMFD)2.0

WW、forever的博客 2978

STL deque实现解析

1.总体概览 双向开口的连续线性空间 头尾均可以常数时间插入和删除 空间是动态地以分段连续空间组合而成,随时可以增加一段新的空间并链接起来,不用像vector那样重新分配新空间再拷贝 deque提供Random Access Iterator 但是其迭代器不是普通指针,复杂度较之于vector会高出很多,所以一般使用vector而不是deque 2.deque的中控器(map) 采用一块所谓...

文王梦熊的博客 726

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

STL源码—deque

deque是一种双向开口的分段连续线性空间,可以在头尾端进行元素的插入和删除。 deque与vector最大的差异就是: deque允许于常数时间内对头端进行插入或删除元素;第二是deque是分段连续线性空间,随时可以增加一段新的空间;deque不像vector那样,vector当内存不够时,需重新分配/复制数据/释放原始空间;不过deque的迭代器设置比vector复杂,因为迭代器不能使用普

xietingcandice的专栏 1090

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

上一篇: 为何STL里stack queue没有迭代器
下一篇: C:\Windows\System32存放的64位
越甲八千
博客等级 码龄11年 2953粉丝 553原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值