1 deque的内部结构
deque宏观上看是一种双向的vector,但源码并非如此。代码实现方式是分段串接,故是分段连续的。
如图,buffer是缓冲区,存储着数据。
对于deque,本质是一个存着指针的vector。图中例子存着5个指针,指向5段缓冲区,就是这5段数据。(vector中存的指针在中间位置)。
无论向前还是向后push数据,当一个缓冲区用完后,会新分配一个缓冲区并用新的指针指向它。
其源码如下:
2 deque的迭代器
deque的迭代器是一个类,要存4个指针。如下图所示:
其中,cur是现在所指向的位置,而node指向“控制中心”,即指向1中所说的vector中指向这一buffer指针的位置。这样,当迭代器要++或–时,它才可以通过控制中心跳到另一个buffer中去
first和last是标示着这个buffer的边界的位置。当++或–到了边界时,就应该跳到下一个缓冲区,方式是每一次移动进行边界判断,当达到边界时,通过node指向控制中心并跳到下一个buffer。
源码如下:
3 deque::insert()
insert函数的含义是:可以在一个指定的位置position,安插一个特定的元素x。在deque中,一个巧妙的操作是可以选择向前插还是向后插。
关于insert_aux函数,如下图所示:
4 deque模拟连续空间
模拟连续空间需要迭代器进行很多的操作符重载:
5 新版本结构
对deque进行一个总结:
6 容器适配器
适配器不能遍历,没有迭代器。
stack和queue,让他内含deque,封装其一些功能即可达到。是一种什么设计模式来着。。。
不光deque可以实现stack和queue,只要有以上操作的都是可以的,但效率一定是不如deque的。下面用list做一个示范:
下面再看其他的一些示范: