前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >STL学习笔记(5)常用容器 deque

STL学习笔记(5)常用容器 deque

作者头像
轻舞飞扬SR
发布2021-04-13 15:02:16
4320
发布2021-04-13 15:02:16
举报
文章被收录于专栏:Visual CodexVisual Codex

deque 容器基本概念

Vector 容器是单向开口的连续内存空间,deque 则是一种双向开口的连续线性空间。所谓的双向开口,意思是可以在头尾两端分别做元素的插入和删除操作,当然,vector 容器也可以在头尾两端插入元素,但是在其头部操作效率奇差,无法被接受。

在这里插入图片描述
在这里插入图片描述

Deque 容器和 vector 容器最大的差异,一在于deque允许使用常数项时间对头端进行元素的插入和删除操作。二在于 deque 没有容量的概念,因为它是动态的以分段连续空间组合而成,随时可以增加一段新的空间并链接起来, 换句话说,像 vector 那样,”旧空间不足而重新配置一块更大空间,然后复制元素,再释放旧空间”这样的事情在 deque 身上是不会发生的。也因此,deque 没有必须要提供所谓的空间保留(reserve)功能. 虽然 deque 容器也提供了 Random Access Iterator,但是它的迭代器并不是普通的指针,其复杂度和 vector 不是一个量级,这当然影响各个运算的层面。因此,除非有必要,我们应该尽可能的使用 vector,而不是 deque。对 deque 进行的排序操作,为了最高效率,可将 deque 先完整的复制到一个 vector 中,对 vector 容器进行排序,再复制回 deque.

deque 容器实现原理

Deque 容器是连续的空间,至少逻辑上看来如此,连续线性空间总是令我们联想到 array 和 vector,但 array 无法成长,vector 虽可成长,却只能向尾端成长,而且其成长其实是一个假象,事实上是由

  • 申请更大空间
  • 原数据复制新空间
  • 释放原空间

共三步骤组成,如果不是 vector 每次配置新的空间时都留有余裕,其成长假象所带来的代价是非常昂贵的。 Deque 是由一段一段的定量的连续空间构成。一旦有必要在 deque 前端或者尾端增加新的空间,便配置一段连续定量的空间,串接在 deque 的头端或者尾端。Deque 最大的工作就是维护这些分段连续的内存空间的整体性的假象,并提供随机存取的接口,避开了重新配置空间,复制,释放的轮回,代价就是复杂的迭代器架构。 既然 deque 是分段连续内存空间,那么就必须有中央控制维持整体连续的假象,数据结构的设计及迭代器的前进后退操作颇为繁琐。Deque 代码的实现远比 vector 或 list 都多得多。 Deque 采取一块所谓的 map(注意,不是 STL 的 map 容器)作为主控,这里所谓的 map 是一小块连续的内存空间, 其中每一个元素(此处成为一个结点)都是一个指针,指向另一段连续性内存空间,称作缓冲区。缓冲区才是 deque 的存储空间的主体。

在这里插入图片描述
在这里插入图片描述

deque 常用操作

1. deque 构造函数
代码语言:javascript
复制
deque<T> deqT;//默认构造形式 
deque(beg, end);//构造函数将[beg, end)区间中的元素拷贝给本身。
deque(n, elem);//构造函数将 n 个 elem 拷贝给本身。 
deque(const deque &deq);//拷贝构造函数。 
2. deque 赋值操作
代码语言:javascript
复制
assign(beg, end);//将[beg, end)区间中的数据拷贝赋值给本身。 
assign(n, elem);//将 n 个 elem 拷贝赋值给本身。 
deque& operator=(const deque &deq); //重载等号操作符 
swap(deq);// 将 deq 与本身的元素互换 
3. deque 大小操作
代码语言:javascript
复制
deque.size();//返回容器中元素的个数 
deque.empty();//判断容器是否为空 
deque.resize(num);//重新指定容器的长度为 num,若容器变长,则以默认值填充新位置。如果容器变短, 则末尾超出容器长度的元素被删除。 
deque.resize(num, elem); //重新指定容器的长度为 num,若容器变长,则以 elem 值填充新位置,如果容器变短,则末尾超出容器长度的元素被删除。
4. deque 双端插入和删除操作
代码语言:javascript
复制
push_back(elem);//在容器尾部添加一个数据 
push_front(elem);//在容器头部插入一个数据 
pop_back();//删除容器最后一个数据 
pop_front();//删除容器第一个数据 
5. deque 数据存取
代码语言:javascript
复制
at(idx);//返回索引 idx 所指的数据,如果 idx 越界,抛出 out_of_range。 
operator[];//返回索引 idx 所指的数据,如果 idx 越界,不抛出异常,直接出错。 
front();//返回第一个数据。 
back();//返回最后一个数据 
6. deque 插入操作
代码语言:javascript
复制
insert(pos,elem);//在 pos 位置插入一个 elem 元素的拷贝,返回新数据的位置。 
insert(pos,n,elem);//在 pos 位置插入 n 个 elem 数据,无返回值。 
insert(pos,beg,end);//在 pos 位置插入[beg,end)区间的数据,无返回值。
7. deque 删除操作
代码语言:javascript
复制
clear();//移除容器的所有数据 
erase(beg,end);//删除[beg,end)区间的数据,返回下一个数据的位置。 
erase(pos);//删除 pos 位置的数据,返回下一个数据的位置。
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-04-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • deque 容器基本概念
  • deque 容器实现原理
  • deque 常用操作
    • 1. deque 构造函数
      • 2. deque 赋值操作
        • 3. deque 大小操作
          • 4. deque 双端插入和删除操作
            • 5. deque 数据存取
              • 6. deque 插入操作
                • 7. deque 删除操作
                相关产品与服务
                容器服务
                腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档