STL(四)——deque

Deque概述

vector是单向开口的连续线性空间,dequeue则是一种双向开口的局部连续线性空间。deque和vector最大的差异在于,deque允许常数时间内对头部进行插入或移除,二在于deque没有容量的观念,因为它是动态地以分段连续空间组合而成,随时可以增加一段新空间并连接起来。虽然deque也提供random access iterator,但迭代器并不像vector那样是普通指针,内部构造很复杂。对deque进行的排序操作,为了最高效率,可以将deque先完整复制到一个vector再进行排序,排序完再复制回去。

deque的中控器

deuqe是局部连续空间,一旦有必要在deque的前端或尾部增加新空间,便要配置一段定量空间,串接在deque的头部或者尾部,这就需要一个能统一管理这些分散空间的变量。SGI STL的实现是维护一个指针表,表里的每个指针指向一段连续的空间,这些空间存在实际的数据。如图

deque的迭代器

deque是分段连续空间,所以deque的迭代器比较复杂。deque的迭代器需要完成两项任务:

1. 能够指向分段连续空间的特定元素

2. 一旦迭代器移动,能够根据自己的位置跳跃到上一个或下一个分段连续空间

扫描二维码关注公众号,回复: 3350682 查看本文章

因此,deque_iterator内部有firsrt、cur、last、node变量来完成以上功能,first是指向当前空间的头部,cur是当前迭代器指向的元素,last的空间的尾部,node则是当前空间在deque指针表的对应位置。可以想象到,如果迭代器行进到当前空间的边缘,只要node+1或者node-1就可以方便地跳转到邻近空间。当迭代器行动时候,curr不断移动,当移动到first或者last的位置,就通过node-1或者node+1,移动到下一个区域。

deque的内存构造

1. 添加元素

添加元素时,如果连续空间还有位置,就会直接添加;如果没有位置了,就需要申请新的空间,并加入到指针表中。需要注意的一点是,指针在指针表中的存放是从中间开始存放的,两端会留出一定的空间,这为push_back和push_front的实现提供了基础,如果指针表不够位置容纳更多的指针,那么会申请更大的内存作为指针表,然后将旧表复制到新表中,当然,首尾两端会预留位置给后来的指针。

2. 删除元素

析构元素,然后释放空间,如果空间没有任何元素,则释放空间,从指针表中删除该空间的指针。

总结

deque看起来只比vector多了pop_front,实际上内部工作流程很复杂,建议无特殊需要还是使用vector吧。

猜你喜欢

转载自blog.csdn.net/Pokemon_Master/article/details/82384444