STL源码剖析---STL容器特征总结(含迭代器失效)

深入剖析SGI STL源码实现与设计精髓 SGI STL 由 Alexander Stepanov 在 1990 年代初主导开发,其核心思想是“泛型编程”——将算法与数据结构解耦,通过模板实现高度可复用的组件。这一理念在当时极具前瞻性。Stepanov 强调“算法应基于抽象接口而非具体类型”,奠定了 STL 的通用性基础。// 示例:泛型 swap 算法体现的设计思想T temp = a;a = b;b = temp;// 所有类型只需支持拷贝构造与赋值。 阅读详情

Vector

1、内部数据结构:连续存储,例如数组。
2、随机访问每个元素,所需要的时间为常量。
3、在末尾增加或删除元素所需时间与元素数目无关,在中间或开头增加或删除元素所需时间随元素数目呈线性变化。
4、可动态增加或减少元素,内存管理自动完成,但程序员可以使用reserve()成员函数来管理内存。
5、迭代器失效
插入:vector的迭代器在内存重新分配时将失效(它所指向的元素在该操作的前后不再相同)。当把超过capacity()-size()个元素插入vector中时,内存会重新分配,所有的迭代器都将失效;
删除:当进行删除操作(erase,pop_back)后,指向删除点及其后元素的迭代器全部失效。
建议:使用vector时,用reserve()成员函数预先分配需要的内存空间,它既可以保护迭代器使之不会失效,又可以提高运行效率。

deque

1、内部数据结构:连续存储或者分段连续存储,具体依赖于实现,例如数组。
2、随机访问每个元素,所需要的时间为常量。
3、在开头和末尾增加元素所需时间与元素数目无关,在中间增加或删除元素所需时间随元素数目呈线性变化。
4、可动态增加或减少元素,内存管理自动完成,不提供用于内存管理的成员函数。
5、迭代器失效
插入:增加任何元素都将使deque的迭代器失效。
删除:在deque的中间删除元素将使迭代器失效。在deque的头或尾删除元素时,只有指向该元素的迭代器失效。

list

1、内部数据结构:双向环状链表。
2、不能随机访问一个元素。
3、可双向遍历。
4、在开头、末尾和中间任何地方增加或删除元素所需时间都为常量。
5、可动态增加或减少元素,内存管理自动完成。
6、迭代器失效
插入:增加任何元素都不会使迭代器失效。
删除:删除元素时,除了指向当前被删除元素的迭代器外,其它迭代器都不会失效。

slist

1、内部数据结构:单向链表。
2、不可双向遍历,只能从前到后地遍历。
3、其它的特性同list相似。
建议:尽量不要使用slist的insert,erase,previous等操作。因为这些操作需要向前遍历,     但是slist不能直接向前遍历,所以它会从头开始向后搜索,所需时间与位于当前元      素之前的元素个数成正比。slist专门提供了insert_after,erase_after等函数进行优化。         但若经常需要向前遍历,建议选用list。

Stack

1、适配器,它可以将任意类型的序列容器转换为一个堆栈,一般使用deque作为支持的序列容器。
2、元素只能后进先出(LIFO)。
3、不能遍历整个stack。
4、适配器,它可以将任意类型的序列容器转换为一个队列,一般使用deque作为支持的序列容器。
5、元素只能先进先出(FIFO)。
6、不能遍历整个queue。
7、适配器,它可以将任意类型的序列容器转换为一个优先级队列,一般使用vector作为底层存储方式。
8、只能访问第一个元素,不能遍历整个priority_queue。
9、第一个元素始终是优先级最高的一个元素。

queue

priority_queue

建议:当需要stack,queue,或priority_queue这种数据结构时,直接使用对应的容器类,     不要使用deque去做它们类似的工作。

Set

1、键和值相等。
2、键唯一。
3、元素默认按升序排列。
4、迭代器失效
删除:如果迭代器所指向的元素被删除,则该迭代器失效。

map

1、键唯一。
2、元素默认按键的升序排列。
3、迭代器失效
删除:如果迭代器所指向的元素被删除,则该迭代器失效。

hash与set、multiset、map、multimap的结合

       它里面的元素不一定是按键值排序的,而是按照所用的hash函数分派的,它能提供更快的搜索速度(当前和hash函数有关)。
建议:当元素的有序比搜索更重要时,应选用set,multiset,map或multimap。否则,选用   hash_set,hash_multiset,hash_map或hash_multimap
建议:往容器中插入元素时,若元素在容器中的顺序无关紧要,请尽量加在最后面。若经常         需要在序列容器的开头或中间增加或删除元素时,应选用list。
建议:对关联容器而言,尽量不要使用C风格的字符串(即字符指针char*)作为键值。如果非用不可,应显示地定义字符串比较运算符,即operator<,operator==,operator<=     等。
建议:当容器作为参数被传递时,请采用引用传递方式。否则将调用容器的拷贝构造函数,其开销是难以想象的。
      STL组建与平台无关,与应用无关,与数据类型无关。
代码如下:
vector<int> vec;
vector<int>::iterator iter = vec.begin();

int main(void)
{
	while(iter != vec.end())
	{
		iter = vec.erase(iter);    //vector删除时迭代器失效,要重新获取迭代器。
	}
	return 0;
}




手把手教你搞定爱思唯尔LaTeX投稿:从模板到PDF生成的全流程避坑指南 本文详细介绍了使用LaTeX投稿爱思唯尔期刊的全流程避坑指南,包括模板选择、文件结构规范、投稿系统文件上传策略、PDF生成与检查等关键步骤。特别强调了避免常见错误如宏包冲突、图片丢失和参考文献问题,并提供了投稿后的应急方案和高阶自动化校验脚本,帮助研究者顺利完成投稿。 阅读详情

相关推荐

Ubuntu24.04/20.04设置网络共享文件夹

Ubuntu20.04利用向日葵远程控制时,不能传输文件。使用linux版本QQ来传输是可以的,不过linuxqq功能真的很弱。因此,打算在Ubuntu系统中建立一个共享文件夹,可在局域网中访问。 1、新建共享文件夹 获取root权限,或者登陆root账户。可在/home文件夹(或其它文件夹)下新建一个文件夹,如share。 右击文件夹,选择“本地网络共享”菜单。按下图设置。 点击确定。如果系统已经安装了samba服务器,就可以进入第3步。如果没有,会提示安装,按提示安装,可能会出错,可进.

willhu2008的专栏 2万+

c++STL容器特点(C++STL相关)

容器的基本知识(常识部分) 容器内的元素可以是基本类型 函数不是基本类型,指向函数的指针是基本类型 像bool char int double pointer可以,reference,function不行 对于关联式容器,排序准则默认的是小于,不是小于等于,调用std::less来判断的 自己定义的类是不能直接放到容器里的不能被复制会造成一个玩家有两份实例 用容器的好处是复制元素很简单但会导致效率...

昔拉的博客 621

【若依(ruoyi)】BootstrapTable列宽定制实战:突破width属性限制的两种方案

本文针对若依(RuoYi)框架中BootstrapTable组件列宽设置失效的常见问题,提供了两种实战解决方案。通过CSS样式覆盖法强制定义列宽,或利用formatter函数进行动态HTML包裹,有效突破width属性限制,实现精准的表格列宽定制。

weixin_29013129的博客 174

STL常用容器总结

必须从一个口数据元素入队,另一个口数据元素出队。能随机存取,不支持遍历1.采用动态存储分配,不会造成内存浪费和溢出2.链表执行插入和删除操作十分方便,修改指针即可,不需要移动大量元素3.链表灵活,但是空间和时间额外耗费较大。

折翼孤雁 1124

S32K144 ADC硬件触发实战:PDB模块配置与DMA传输全流程解析

本文详细解析了S32K144微控制器中ADC硬件触发的全流程实现。通过配置PDB模块产生精确的定时触发信号,并联动DMA实现转换数据的自动搬运,构建了一个无需CPU干预的高效、低抖动数据采集系统。文章深入讲解了时钟配置、模块初始化、DMA引擎搭建及实战调试技巧,为汽车电子和工业控制应用提供了可靠的解决方案。

weixin_29174141的博客 226

41-dify案例分享-基于database插件实现Text2sql的数据库查询图表工作流

本文介绍基于 Text2SQL 的 Dify 工作流实现过程。先阐述 Text2SQL 概念、步骤及应用领域。接着说明工作流制作,包括用 chatflow 加开场白、获取系统时间,配置 LLM 生成 SQL,用 SQL Execute 工具查询,经 LLM 汇总结果,代码生成 ECharts 数据,条件分支判断图表类型输出。最后介绍验证测试、提供体验地址,还提及借助工具生成建表和初始化数据 SQL 语句。

个人技术 1万+

STL容器特征汇总

STL中顺序容器类和关联式容器类的主要特征如下: (1)Vector 1、内部数据结构:连续存储,例如数组。 2、随机访问每个元素,所需要的时间为常量。 3、在末尾增加或删除元素所需要时间与元素数目无关,在中间或开头增加或删除元素所需时间随元素数目呈线性变化。 4、可动态增加或减少元素,内存管理自动完成,但程序员可以使用reserve()成员函数来管理内存。 5、vector的

mengni123321的专栏 634

基于Ardupilot/PX4固件,APM/PIXhawk硬件的VTOL垂直起降固定翼软硬件参数调试(第二篇)软硬件参数调试

基于Ardupilot/PX4固件,APM/PIXhawk硬件的VTOL垂直起降固定翼软硬件参数调试(第二篇) 本文内容大部分来自Kris,我们的K大,在VTOL领域的大牛,在此,非常感谢K大。能引用K大的成果也是自己的荣幸,不便之处还请K大多多包涵,在此引用只是为方便自己日常学习,部分参数表里根据自身情况,增加了修改环节和相应参数。 垂直起降固定翼 中文教程-参数设置 垂直起降固定翼是由 多轴+...

u011322358的博客 2万+

C++中STL常用容器的优点和缺点

我们常用到的STL容器有vector、list、deque、map、multimap、set和multiset,它们究竟有何区别,各自的优缺点是什么,为了更好的扬长避短,提高程序性能,在使用之前需要我们了解清楚。verctorvector类似于C语言中的数组,它维护一段连续的内存空间,具有固定的起始地址,因而能非常方便地进行随机存取,即 [] 操作符,但因为它的内存区域是连续的,所以在它中间插入或

Potter:I am not for learning and learning, but for study and work 9672

告别Inspect!用微软官方推荐的Accessibility Insights搞定WinApp自动化测试元素定位

本文介绍了如何从传统的Inspect工具升级到微软官方推荐的Accessibility Insights for Windows,以提升Windows应用自动化测试中的元素定位效率。通过详细的功能对比、安装指南和实战技巧,帮助测试工程师掌握这款现代化工具的核心优势,包括实时元素检测、属性筛选和与WinAppDriver、Appium等测试框架的无缝集成。

weixin_26749245的博客 622

YOLOv11 改进 - 特征融合 | RepGFPN重参数化特征金字塔网络 ,实现高效多尺度特征交互与融合

本文介绍了DAMO - YOLO目标检测方法及其相关技术在YOLOv11中的结合。DAMO - YOLO扩展了多项新技术,如MAE - NAS搜索检测主干网络、Efficient - RepGFPN构建检测neck等。在neck设计上,针对原始GFPN存在的问题,提出Efficient - RepGFPN,包括对不同尺度特征使用不同通道数、删除Queen - Fusion中额外上采样操作、改进特征融合方式等。我们将相关模块集成进YOLOv11,替换部分模块。

魔改工程师的博客 937

C++ STL源码剖析 8-iterator

在 C++ 标准模板库(STL)中,迭代器是一种抽象概念,用于提供对容器内元素的访问。迭代器可以视为指向容器中某个位置的指针,它封装了访问容器元素的方法。迭代器定义了对容器元素进行遍历、访问、插入和删除等操作的方式。T* data;return tmp;it!++it) {// 使用 *it 访问元素在这个示例中,我们定义了一个简单的容器,它包含一个简单的迭代器类。迭代器类提供了operator*operator->

wesigj的博客 1993

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【C++】list迭代器的深度剖析及模拟实现(感受类封装,类和对象的思想)

list迭代器的深度剖析,感受类封装,类和对象的思想,反过来思考迭代器类的设计,感受模板参数带来的好处,对比vector和list…

The porters of knowledge 1569

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

C++效率掌握之STL库:map && set底层剖析及迭代器

摘要: C++ STL中的std::map和std::set基于红黑树实现,保证元素有序且操作高效(O(log N))。set存储唯一键,map存储键值对,均支持自动排序和稳定迭代器(插入不失效,删除仅当前迭代器失效)。与哈希容器相比,它们擅长区间查询和有序遍历,但查找稍慢。使用时应避免map[key]的隐式插入陷阱,优先通过find或迭代器安全操作。掌握其底层原理及迭代器特性可优化性能敏感场景的应用。

likuoelie的博客 433

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

深入源码!C++ STL容器底层原理与内存模型全景剖析

本文深入剖析了 C++ STL 中常用容器的底层原理:vector 的三指针动态数组模型、list 的循环双向链表节点、deque 的分段连续中控器设计、基于红黑树的有序关联容器以及哈希表的开链实现。通过简化版 vector 源码,我们直观看到了内存管理与迭代器失效的本质。理解这些内部机制能够帮助我们在开发中做出更精准的容器选择,避免性能陷阱和未定义行为。记住以下要点:- 每次可能导致扩容的 vector 操作后,检查迭代器是否需要更新。- 优先使用emplace系列函数和移动语义减少拷贝。

huozhe01的博客 190

STL容器特征总结及源码剖析

Vector 1、内部数据结构:连续存储,例如数组。 2、随机访问每个元素,所需要的时间为常量。 3、在末尾增加或删除元素所需时间与元素数目无关,在中间或开头增加或删除元素所需时间随元素数目呈线性变化。 4、可动态增加或减少元素,内存管理自动完成,但程序员可以使用reserve()成员函数来管理内存。 5、迭代器失效 插入:vector的迭代器在内存重新分配时将失效(它所指向的元素在该

358

【待总结】STL容器

STL 对定义的通用容器分三类:顺序性容器、关联式容器和容器适配器。 顺序性容器 是一种各元素之间有顺序关系的线性表,是一种线性结构的可序群集。顺序性容器中的每个元素均有固定的位置,除非用删除或插入的操作改变这个位置。这个位置和元素本身无关,而和操作的时间和地点有关,顺序性容器不会根据元素的特点排序而是直接保存了元素操作时的逻辑顺序。比如我们一次性对一个顺序性容器追加三个元素,这三个元素在容器中...

beibaoke910的专栏 251

C++标准库源码解读:STL容器实现原理与性能分析

本文深入剖析了C++ STL主要容器的内部实现原理,从内存布局、数据结构、迭代器设计到性能分析,并结合源码片段展示了具体实现细节。理解这些原理有助于开发者在实际项目中做出正确的容器选择,编写出高效、健壮的代码。STL的设计充分体现了泛型编程和数据结构的高效结合,其源码是学习C++高级编程和数据结构的宝贵资源。希望读者通过本文能对STL容器有更深刻的认识,并在实践中灵活运用。

王同学的博客 316
上一篇: STL源码剖析---迭代器失效小结
下一篇: STL源码剖析---红黑树原理详解上
hackbuteer1
博客等级 码龄15年 1万+粉丝 251原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值