C++标准库分析总结(五)——

本节主要总结标准库Deque的设计方法和特性以及相关迭代器内部特征

1、Deque基本结构

  • Deque(双向队列)也号称连续空间(其实是给使用者一个善意的谎言,只是为了好用),其实它使用分段拼接起来的(分段连续),各个分段间是用Vector来管理的,Vector的每个元素就是一个指针,每个指针指向一个分段,每一个分段就是一个缓冲区buffer,首位安插元素时,当缓冲区满了需要扩充时,就重新分配一个缓冲区然后串在Vector里面;
  • Deque的迭代器有4个指针,其中node表示在控制中心的位置(也就是在Vector中的位置),first表示node所指的buffer的头,last表示node所指的buffer的尾,first和last是边界的标兵,它们时不会变的,cur表示迭代器当前指向的哪个元素;
  • 分段连续的实现,当迭代器前进后者后退时,都要判断是不是走到了当前buffer的末端或者头部,都必须有能力跳到下个buffer缓冲区,如果到达边界就必须依靠node指针回到控制中心(Vector)再跳到下个buffer
  • 每个缓冲区大小:512字节除以放入数据的字节大小,比如放int,缓冲区大小=512/sizeof(int)

C++标准库分析总结(五)——<Deque、Queue、Stack设计原则>

2、 Deque迭代器

Deque的迭代器sizeof是16,一个Deque包含两个迭代器,一个指针一个size_type,所以Deque的sizeof为16+16+4+4=40个字节

C++标准库分析总结(五)——<Deque、Queue、Stack设计原则>

C++标准库分析总结(五)——<Deque、Queue、Stack设计原则>

2.1 Deque的插入操作deque<T>::insert()

  由于Deque是可以两端进行扩充的,插入元素又会引入元素移动问题,进而带来拷贝构造的开销,所以在插入时首先进行判断插入位置距离首位哪边比较短,移动距离较短的一边,最大化的减少开销。

C++标准库分析总结(五)——<Deque、Queue、Stack设计原则>

C++标准库分析总结(五)——<Deque、Queue、Stack设计原则>

2.2 Deque如何实现所谓的连续空间

  Deque对外宣称是连续空间,其实它是分段连续,那么连续空间就是要模拟连续空间提供的功能,比如自增、自减、跳跃等动作,这就是迭代器的功劳。

C++标准库分析总结(五)——<Deque、Queue、Stack设计原则>

C++标准库分析总结(五)——<Deque、Queue、Stack设计原则>

注意:跳跃和加减操作都要注意当前缓冲区是否到边界的问题,如果到了边界要先回到控制中心(通过node指针),再进而转到下一个缓冲区

C++标准库分析总结(五)——<Deque、Queue、Stack设计原则>

C++标准库分析总结(五)——<Deque、Queue、Stack设计原则>

C++标准库分析总结(五)——<Deque、Queue、Stack设计原则>

C++标准库分析总结(五)——<Deque、Queue、Stack设计原则>

C++标准库分析总结(五)——<Deque、Queue、Stack设计原则>

3、queue

  先进先出队列,其实内部实现就是用deque,只是把不用的功能封掉,所以queue自己不做事它只是把事交给deque来做,所以我们不把queue称之为容器,把它称为容器适配器(把别人改装一下用)。

C++标准库分析总结(五)——<Deque、Queue、Stack设计原则>

4、stack

  先进后出(栈),其实内部实现也是用deque,只是把不用的功能封掉,所以queue自己不做事它只是把事交给deque来做,所以我们不把stack称之为容器,把它称为容器适配器(把别人改装一下用)。

C++标准库分析总结(五)——<Deque、Queue、Stack设计原则>

5、stack和queue总结

  stack和queue也可以用list做底部结构,但是官方默认用dequq因为比较高效

C++标准库分析总结(五)——<Deque、Queue、Stack设计原则>

注意:对于模板来说,编译器都是用哪一行才去检查哪一行,不会再编译期间检查

C++标准库分析总结(五)——<Deque、Queue、Stack设计原则>

 

原文链接: https://www.cnblogs.com/laiyingpeng/p/11193946.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    C++标准库分析总结(五)——<Deque、Queue、Stack设计原则>

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/299172

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月15日 下午8:21
下一篇 2023年2月15日 下午8:22

相关推荐