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

技术标签: 4_C++ STL

节主要总结标准库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)

2、 Deque迭代器

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

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

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

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

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

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

3、queue

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

4、stack

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

5、stack和queue总结

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

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

 

作者:灼光

出处:https://www.cnblogs.com/laiyingpeng

本博客文章大多为原创,转载请在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

来源:https://www.cnblogs.com/laiyingpeng/p/11193946.html


智能推荐

C++学习篇(9)-详解deque、stack、queue的实现原理

       本篇内容主要介绍STL六大组件之一的序列式容器中的deque、stack、queue,如果对文章内容感兴趣,欢迎大家多多关注微信公众号" 爱折腾的码农 ",二维码见下图。另外本人将自己在秋招过程中遇到的一些算法题和总结的典型代码题汇总成word文档和pdf文档。里面内容包括但不限于数据结构中的冒泡、堆排、归并、快排等排序方法...

【C++】STL系列(6):容器deque以及其支撑的stack和queue

–本文章来自侯捷老师的STL课程和自己的理解 若有错误,欢迎指正 现在我们来介绍以下STL容器中相对复杂一点的容器,deque。 deque是一个双端队列,本质上是分段连续,如上图,是使用Vector装入指针,由指针指向缓冲区的方式来串接整个deque的。由于其独特的设计,因此呈现给用户的看起来就像是一个可动态扩展的连续的双端队列。 部分源码如上图,可以看见deque内部有两个迭代器,...

21 容器deque&queue&stack深度探索

1、概述 本篇主要介绍STL容器deque的数据结构,deque是属于序列化结构(sequence),可以向容器两端增加或删除数据。deque容器可以当做线性结构使用,而实际上deque的设计是分段连续的,并不是像array或vector一样是连续的,详细介绍如下。而queue堆和stack栈的设计,是复合了容器deque,然后关闭deque的部分功能来实现。 2、G2.9中容器deque结构图分...

C++ queue 和 deque的区别

从使用的角度来讲主要差别就是: deque支持push_front、pop_front、push_back、pop_back。 queue支持push_back、pop_front。 ---------------------------------------------------------------------------- deque是双端队列 支持push_front、pop_fro...

STL标准库-容器-deque

技术在于交流、沟通,本文为博主原创文章转载请注明出处并保持作品的完整性。 deque双向开口可进可出的容器 我们知道连续内存的容器不能随意扩充,因为这样容易扩充别人那去 deque却可以,它创造了内存连续的假象. 其实deque由一段一段构成 ,他是分段连续,而不是内存连续 当走向段的尾端时候自动跳到下一段 所以支持迭代器++ 操作,自动跳到下一段的方法由operator++实现 deque每次扩...

猜你喜欢

API 栈(stack)队列(queue)双端队列(Deque)优先队列(Priority Queue)

API(应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码。 stack栈 queue队列 Deque(Double-End Queue)双端队列 queue和stack的结合体 插入删除均为O(1),查询为O(n)。 Priority Queue 插入操作:O(1) 取出操作:O(logN)-按照元素优先级取出...

stack&amp;&amp;queue&amp;&amp;deque&&priority_queue用法详解

栈和是一种容器适配器,专门设计用于在LIFO上下文(后进先出)中操作,其中元素仅从容器的一端插入和提取。 而队列则是FIFO,其元素从队列尾部进入,头部出 栈的元素从被称作“栈顶”的位置弹出/放入,容器只允许在栈顶一段进行操作,如图所示 在c++中使用栈和队列需要#include<stack>或#include<queue> 其包含以下成员函数 si...

C/C++面试:48---vector、list、deque、stack、queue的区别是什么?底层是如何实现的?

一、序列式容器vector、list、deque vector 可变大小数组。支持快速随机访问。在尾部之外的位置插入或删除元素可能很慢 deque 双端队列。支持快速随机访问。在头尾插入/删除速度很快 list 双向链表。只支持双向顺序访问。在list中任何位置进行插入和删除的速度都很快 forward_list 单向链表。只支持单向顺序访问。在链表任何位置进行插入和删除操作速度都很快 array...

如何更有价值采集数据、高效分析数据?

上回说到,用户行为数据的意义和价值《为什么要进行用户行为分析?》,以及互联网产品用户模型的构建,这其中就包含了对数据的采集和分析两大块儿,本文将从数据采集的三大要点、如何让分析更有价值更高效、以及数据分析思维三部分展开聊。 一、数据采集的三大要点 1、全面性 数据量足够具有分析价值、数据面足够支撑分析需求。 比如对于“查看商品详情”这一行为,需要采集用户触发时的环境信息、会...

shell脚本编程基础(三)

结构化命令(一) if-then和case语句。 If-then-else语句 当if语句中的命令返回非零退出状态码时, bash shell会执行else部分中的命令。 嵌套if-then语句的问题在于代码不易阅读,很难理清逻辑流程。 可以使用else部分的另一种形式:elif。这样就不用再书写多个if-then语句了。 elif使 用另一个if-then语句延续else部分。 elif语句行提...

问答精选

URL for a user content site and SEO

I was thinking about how i should write my URLs. I want them to A) Be user friendly B) SEO C) allow fast DB queries. The information i have are username, category, mediaId, title and other data i dont...

How to use the Clojure -> macro with an inner function

I'm a Clojure beginner and I want to understand the -> macro This code works: But this doesn't even compile and I don't know how to deal with the error message: CompilerException java.lang.IllegalA...

Java Program to make Tic Tac Toe not working

For my programming class I'm supposed to make a program that simulates a game of tic tac toe. My teacher provided all the methods and said we shouldn't need to add any or take any away, and told us we...

How can i exit the for statement in assembly

The purpose of this code is to flash the bits turned on three times, exit the loop and turn them off. Currently the code seems to be in an infinite loop and does not exit the loop after the count is 0...

Simple Camel test fails with no messages recieved

Am using Spring Boot and I have just added camel to it. I have a simple camel route setup : When I try to create simple test for this route with : It fails with Not sure what could be a problem here. ...

相关问题

相关文章

热门文章

推荐文章

相关标签

推荐问答