您的位置:首页 > 编程语言 > C语言/C++

C++学习笔记12 STL Deque

2017-09-08 21:20 190 查看
deque双端队列其实就是一个双端数组

deque是双端队列,它有vector没有的功能,push_front,在序列头部添加元素,它的底层设计也不同于vector,deque的底层是用间接索引的方式实现的,如下图所示:



开始的时候map是一个指针数组,里面存储着若干个指针,但初始的时候只有其中的一个指针有对应的值,比如是中间的一个指针,它指向内存中的堆中申请的一片连续的内存,这块内存大小一般是固定的(可能为512字节),此时有迭代器指针的头和尾指向当前位置。

当向deque中添加数据的时候,先看是那种添加方式,如果是push_back,那么就在这个连续的内存块当中添加对象数据;

如果是push_front,此时因为前面没有内存,所以此时就要申请一块新的连续的内存,并用map中已知指针前面的位置的那个指针指向这片内存,并在这块内存最后的一定大小的字节中存储数据,并修改迭代器的begin,如果是push_back,那么就直接在迭代器的end处添加元素,然后迭代器的end+1。

那么当删除元素的时候怎么办呢?当在首部或者尾部删除元素,此时很好办,直接让迭代器的头向前移动或者尾向后移动一下就可以了,此时效率很高,并且此时的修改并不会影响deque原有的迭代器,即在此之前的迭代器不会失效

但如果在中间某个地方删除或者添加元素的时候可能就要考虑怎么移动的问题了,此时要判断要插入或者删除的位置离哪边近一些,然后就对近的那一段进行移动。

所以对于deque来说,中间删除或者添加元素也是代价很高的,但在开头和尾部删除和添加元素代价很少,另外由于deque是间接取元素,所以它的随机访问(operator[])的效率要比vector低一些。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: