详情: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的双向拓展。