deque与vector的差异:
1 deque允许于常数时间对头端进行插入或移除操作
2 deque没有容量(capacity)观念,因为它是以动态地分段连续空间(中控器)组合而成
3 deque避免了“重新配置、复制、释放”的轮回,代价则是复杂的迭代器架构。
迭代器++:切换至下一个元素,如果已达所在缓冲区的尾端,就却换至下一节点(即下一缓冲区)的第一个元素。
迭代器--:如果已达所在缓冲区的头端,就却换至前一节点(即上一缓冲区)的最后一个元素的上一位置。
deque的数据结构:
1 指向map的指针
2 start,finish两个迭代器,分别指向第一个缓冲区的第一个元素(注意不是map的第一个节点,而是靠中间位置的nstart),和缓冲区的最后一个元素(注意不是map的最后一个节点,而是靠中间位置的nfinish)。
3 map_size map内有多少指针(即多少缓冲区)
注意:以下令nstart,nfinish指向map所拥有之全部节点的最中央区段,保持在最中央,可使头尾两端的扩充能量一样大,每个节点可对应一个缓冲区。
在尾端再添加一个元素,到达当前缓冲区的尾端时,引发新缓冲区的配置,同时也导致迭代器finish的状态改变。
在头端再添加一个元素,到达当前缓冲区的头端时,引发新缓冲区的配置,同时也导致迭代器start的状态改变。
map何时需要重新整治:
1 如果map的尾端节点备用空间不足-->reallocate_map()
2 如果map的前端节点备用空间不足-->reallocate_map()
reallocate_map():
1 map的所有节点数>新的节点数(此时说明并不是map被占满了,而是一端map已经满了),调整start和finish迭代器。
2 map的所有节点数<新的节点数
配置一块空间,准备给新map使用
把原map内容拷贝过来
释放原map
设定新map的起始地址与大小
注:deque的最初状态(无任何元素时)保留一个缓冲区,即map中至少有一个节点。
区别“析构”与“释放”:
destroy(迭代器)只是调用析构函数,并不释放内存。
析构函数并不释放内存,只是在释放内存的时候调用了它一下而已。
释放尾缓冲区,注意,头缓冲区保留。