deque的构造与内存管理


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()

如果map的前端节点备用空间不足-->reallocate_map()

reallocate_map():

1 map的所有节点数>新的节点数(此时说明并不是map被占满了,而是一端map已经满了),调整start和finish迭代器。

map的所有节点数<新的节点数 

配置一块空间,准备给新map使用

把原map内容拷贝过来

释放原map

设定新map的起始地址与大小


注:deque的最初状态(无任何元素时)保留一个缓冲区,即map中至少有一个节点。

区别“析构”与“释放”:

destroy(迭代器)只是调用析构函数,并不释放内存。

析构函数并不释放内存,只是在释放内存的时候调用了它一下而已。

释放尾缓冲区,注意,头缓冲区保留。


  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值