《STL源码剖析》 第4章 序列式容器总结

本文深入探讨C++中序列式容器和配接器的使用,包括vector、list、deque、stack、queue及优先级队列的特性、操作和实现细节,通过实例解析容器的高效应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

4.1  序列式容器:其中的元素都可许,但未必有序,有array,vector,list,deque;配接器:stack,queue,priority_queue。

4.2 vector:其实就是动态数组,配置较大的空间,用于添加元素,避免多次申请空间,不断的重复“配置新空间、数据移动、释放旧空间”的过程。

vector默认使用了alloc空间配置器,定义了其5个型别pointer等,其中iterator为T*(vector泛型参数类型的指针),主要包括了start、finish(当前已使用元素的下一个位置)、end_of_storage(表示目前可用空间的尾)和一些函数。

STL源码剖析上有这些函数的定义式,vector使用push_back在尾部插入元素,如果finish!=end_of_storage,则使用全局函数construct在finish处加入x的值,finish后移一位;否则,需要申请当前大小2倍的空间,复制旧元素,添加x,释放就空间,而这里面都是使用的2.3的内存基本处理工具的全局函数,包含在<memory>头文件中。

erase的重载函数实现了元素的删除功能,先将最后一个要删除元素的下一个值到尾部的值,利用全局函数copy复制到第一个要删除元素的位置,然后利用destroy函数释放掉从finish处往前的删除元素个数值。

insert(iterator position,size_type n, const T& x):在position开始,插入n个x

经观察,只考察n>0的情况,当end_of_storage-finish>=n即备用空间大于插入元素个数时,不需要新申请空间,此时考虑两种情形,1.插入点之后的元素大于n,先将finish前的n个元素插入到finish后n个位置,再将position到finish-n之间的元素插入到finish之前,最后在po

sition处填充n个x,如图所示(有点乱,大概是这个意思,但是没有准确的画出来,只是大概标示了步骤2的位置在finish前);2.插入后的现有元素个数(elems_after)>=n,现在finish后添加n-elems_after个x,然后将position到finish之间的元素复制到x之后,把position到finish之间的元素设置为x。如果备用空间不足时,申请旧长度的两倍或者旧长度和新增元素个数,然后,将原来position前的元素复制到新空间起始处,添加n个x,再把position后的元素复制到x之后。

4.3 list:双向循环链表,有一个没有值的头结点,用于标示空链表,此时prev和next都指向结点本身。

list的操作,其实都是对双向循环链表的操作,而且不用特殊的处理头结点,思路相对简单,只要注意结点类型和迭代器的类型即可。

list的迁移操作transfer实现了将迭代器范围内的元素插入到指定位置,其它的splice、merge等操作都使用了该函数。其中sort函数我感觉比较好,书上说采用了quick sort方法,建议大家看一下(PS:我不太懂!!!)


4.4 deque:双向开口的连续空间,他是动态的以分段连续空间组合而成,随时增加一段新的空间并连接起来。

deque使用所谓的map控制这些分段的空间,建议看一下书上的几个图片,就知道deque实现的原理了,但是,实现起来估计很麻烦。


4.5 stack:采用deque实现,使用deque的方法就可以实现stack的FILO功能。


4.6queue:默认采用deque实现,同stack。其中stack和queue都没有迭代器。


4.7 heap:基于vector的完全二叉树,默认是大顶堆。

push_heap:将新插入的元素放到最下一层的最右边作为叶子结点,不断与父节点比较,若大于父节点的值,就交换,直至小于父节点,该位置就是新插入元素的位置。

pop_heap:去掉各节点(len/2),从上到下,将左右孩子中较大的结点放入到根节点处,循环进行直到到达叶子结点,然后将最后一个结点放入到刚刚的叶子结点中,再利用push_heap的方法调整heap。但是,最大值并没有删除,只是放到了最后的位置。(PS:为什么不之间把最后一个结点和根调换,然后从上到下开始调整呢?这个最多只要一个logN啊????)

其他的函数都是建立在这两个函数的基础上的,不断的插入和读取。


4.8 priority_queue:优先权队列,基于heap实现的。push就是push_heap,pop即pop_heap,然后在删除元素。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值