C++ STL之deque解析(1)---《C++ STL》

8 篇文章 0 订阅

详情:https://zcheng.ren/2016/08/26/STLDeque/#push-back

C++ STL中为什么实现deque呢?C++怎样实现deque呢?

先来解释第一个问题?STL设计了vector和list,
vector是内存中一段连续存储的空间,针对随机访问和存储,下标操作符表现都很棒的;那么它有什么缺点呢?当然啦,当进行插入、删除或者拷贝等问题时候,需要移动一大批数据,这样导致效率非常低的!
list则是在内存中是以节点的数据存储数据的,以非连续的内存存放数据的,所以对其进行插入、删除或者拷贝表现很不错,但是它的问题也很明显:随机访问和存取、下标操作都无法支持,而且比vector占用的内存要多
为了解决这种问题,STL设计者提出了一种设计思路:为什么不能将两者的优点结合起来呢?于是就出现了deque,它的设计结构如下:
这里写图片描述
我们可以看见有一个map结构,里面的元素是指向存放元素的块的第一个位置,这样我们就可以让deque形成一种虚假的连续内存,结合了list的存储结构和vector的存储结构,即deque创建了许多连续的内存空间,称为块,然而这些块之间却并不连续,通过一个map结构将这些块之间联系起来(虚假连续),map中的元素指向的是存储元素的块的首元素的地址啦!
现在我们来讲一下iterator的存储结构:
这里写图片描述
可以看出iterator中包含了4个部分,其中cur,first和last指向的是块中分配的当前位置,起始地址和结束地址,通过这种结构访问内存空间,高效处理。
注意:
1)deque中包含了两个iterator,start和finish,用于执行push_front,pop_front和push_back,pop_back操作的,保证了deque的双向操作;
2)在插入和删除操作的时候注意块中元素的移动方向,不要出现元素覆盖哟!!!
3)注意在设置start和finish位置的时候尽量将其放在map的中间,方便map的双向拓展。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值