面试网易的时候特么问我deque,从来没用过啊(委屈脸)。


deque:双端队列,它是动态地以分段连续空间组合而成的,随时可以增加一段新的空间并链接起来。

deque和vector的区别:

  1. deque允许于常数时间内对头端进行元素的插入和移除操作。
  2. deque没有capacity观念。
  3. deque没有像vector那样“因旧空间不足而重新配置一块更大的空间,然后复制元素,再释放旧空间”。
  4. 如果想为deque排序,我们可以把deque复制到vector中然后给vector排序,再复制回deque(笑脸~)。

deque的迭代器非常的复杂。

首先,deque采用一块所谓的map作为主控,map是一小块连续空间,其中每个元素node都是指针,那么这个map是一个指向指针的指针,T**,node呢,指向另一端较大的连续线性空间,称为缓存区,缓存区才是deque的存储空间主体,默认512bytes一个。

deque维护一个指向map的指针,维护start,finish两个迭代器,分别只想第一缓冲区的第一个元素和最后缓冲区的最后一个元素,还记住目前的map大小。map如果不够大了,也是需要重新配置一块更大的。

deque的迭代器有

  • cur,指向缓冲区中的现行元素
  • first,指向缓冲区的头
  • last,指向缓冲区的尾,含备用空间
  • node,指向map管控中心。

了解了deque的数据结构,我们就可以知道deque的各种操作时会发生什么了。

【STL源码剖析】deque!!!


  • 迭代器遍历读取数据的时候,从start开始,start也是第一个缓冲区的first,遍历到last的时候,转用node,去读取map中下一个缓冲区的first,如此进行下去,实现我们所看到的顺序读取。
  • 插入操作,比如尾插,如果当前你要插入的缓存区还有比1个多的备用空间,那直接插入,如果只剩1个了,插入完就要开辟新的缓冲区了。
  • map要管理几个node,最少8个,最多是所需node加2,扩充时可用。
  • 删除操作,这时候就要考虑缓冲区释放的情况。

相关文章: