STL学习之deque

deque是一种双向开口的 分段连续线性空间 ,所谓双向开口是可以在头尾两端分别做元素的插入和删除操作。
如下图:

回想vector,它内部是一个线性的数组,那么实际也可以做到deque双向开口的特性,但是你可以看下vector的成员函数,插入和删除只提供push_back()和pop_back(),并没有push_front()和pop_front(),这是为什么呢? 其实主要还是效率的考虑,vector在头部插入和删除是非常低效的,需要copy大量元素,所以不支持该函数绝对是没任何异议的。

deque内存空间组织结构:

相比于vector,deque实际上不是绝对的线性连续空间,只是一种伪线性连续,称之为分段式线性连续,绝对线性连续存在动态扩容的不便,所以采用分段式在扩容和性能上做了一个折中方案。deque的内存结构主要由两部分组成:中控器map和数据缓冲区。中控器map是一个数据缓冲区表,把各个数据缓冲区串联起来;数据缓冲区存储用户的数据。

有了上面的图,我们已经大概上猜到deque元素的管理方式了,deque中是怎么样进行迭代器++和--的呢,下图是迭代器的数据结构示意:

deque中会维护两个迭代器start,finish,分别指向头和尾的数据缓冲区。当数据缓冲区需要扩充的时候,会新申请1个数据缓冲区,这时中控器map会在下一个位置的指针指向新的数据缓冲区,同事finish迭代器也会指向新的数据缓冲区。
因为deque不是绝对连续的空间,因此迭代器移动操作都会比普通的结构要复杂很多。

中控器map的扩容?

从deque的特性可以看出,在deque之上有很多中玩法,所以deque可以作为很多adaptor的底层实现,非常之重要!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值