C++——deque

article/2025/10/4 2:06:56

 

文章目录

  • Deque 与 vector 的异同点
  • 构造操作
  • 非更易型操作
  • 更易型操作
  • 使用例子

 
 

  容器 deque (发音为“deck”)和 vector 非常相似。它也采用dynamic array来管理元素,提供随机访问,并有着和 vector 几乎一模一样的接口。不同的是 deque 的 dynamic array 头尾都开放,因此能在头尾两端进行快速安插和删除(如下图所示)。
deque的逻辑结构
为了提供这种能力, deque 通常实现为一组独立区块,第一区块朝某方向扩展,最末区块朝另一方向扩展,如下图所示。
deque的内部结构deque 包含在头文件< deque >中:

#include <deque>

其中,deque 类型定义于命名空间 std 内的一个class template:

namespace std {template <typename T,typename Allocator = allocator<T> >class deque;
}

和 vector 相同,这里的第一个 template 参数用来表明元素类型。第二个 template 实参可有可无,用来指定内存模型,默认为 allocator。

 
 

 
 

 
 

Deque 与 vector 的异同点

Deque 与 vector 相比,功能上的差异如下:

  • deque 两端都能快速安插元素和移除元素(vector 只在尾端逞威风)。这些操作可以在摊提的常量时间内完成。
  • 访问元素时 deque 内部结构会多一个间接过程,所以元素的访问和迭代器的动作会稍稍慢一些。
  • 迭代器需要在不同区块间跳转,所以必须是个 smart pointer,不能是寻常 pointer。
  • 在内存区块大小有限制的系统中(例如PC系统), deque 可以内含更多元素,因为它使用不止一块内存。因此 deque 的 max_size() 可能更大。
  • Deque 不支持对容量和内存重新分配时机的控制。特别要注意的是,除了头尾两端,在任何地点安插或删除元素都将导致指向 deque 元素的任何 pointer、reference 和 iterator 失效。不过,deque 的内存重分配优于 vector,因为其内部结构显示, deque 不必在内存重新分配时复制所有元素。
  • Deque 会释放不再使用的内存区块。Deque 的内存大小是可缩减的,但要不要这么做,以及如何做,由实现决定。

Deque 的以下特性跟 Vector 差不多:

  • 在中段安插、移除元素的速度相对较慢,因为所有元素都需移动以腾出或填补空间。
  • 迭代器属于 random-access iterator (随机访问迭代器)。

以下情形最好采用 deque:

  • 你需要在两端安插和移除元素(这是 deque 的拿手好戏)。
  • 无须指向(refer to)容器内的元素。
  • 要求“不再使用的元素必须释放”(不过 C++ standard 对此无任何保证)。

Vector 和 deque 的接口几乎一样,所以如果你不需要什么特殊性质,两者都可试试。

 
 

 
 

 
 

构造操作

操作描述
deque< Elem > cDefault 构造函数,产生一个空 deque,没有任何元素
deque< Elem > c(c2)Copy 构造函数,建立 c2 的同型 deque 并成为 c2 的一份拷贝(所有元素都被复制)
deque< Elem > c= c2Copy 构造函数,建立一个新的 deque 作为 c2 的拷贝(每个元素都被复制)
deque< Elem > c(rv)Move 构造函数,建立一个新的 deque,取 rvalue rv 的内容(始自C++11)
deque< Elem > c = rvMove 构造函数,建立一个新的 deque,取 rvalue rv 的内容(始自C++11)
deque< Elem > c(n)利用元素的 default 构造函数生成一个大小为 n 的 deque
deque< Elem > c(n, elem)建立一个大小为 n 的 deque,每个元素值都是 elem
deque< Elem > c(beg, end)建立一个 deque,以区间 [beg, end) 作为元素初值
deque< Elem > c(initlist)建立一个 deque,以初值列 initlist 的元素为初值(始自C++11)
deque< Elem > c = initlist建立一个 deque,以初值列 initlist 的元素为初值(始自C++11)
c.~deque()销毁所有元素,释放内存

 
 

 
 

 
 

非更易型操作

操作描述
c.empty()返回是否容器为空(相当于 size()==0 但也许较快)
c.size()返回目前的元素个数
c.max_size()返回元素个数之最大可能量
c.shrink_to_fit()要求降低容量,以符合元素个数(始自C++11)
c1 == c2返回 c1 是否等于 c2(对每个元素调用==)
c1 != c2返回 c1 是否不等于 c2(相当于!(c1==c2))
c1 < c2返回 c1 是否小于 c2
c1 > c2返回 c1 是否大于 c2(相当于c2<c1)
c1 <= c2返回 c1 是否小于等于 c2(相当于!(c2<c1))
c1 >= c2返回 c1 是否大于等于 c2(相当于! (c1<c2))
c[idx]返回索引 idx 所指的元素(不检查范围)
c.at(idx)返回索引 idx 所指的元素(如果 idx 超出范围就抛出 range-error 异常)
c.front()返回第一元素(不检查是否存在第一元素)
c.back()返回最末元素(不检查是否存在最未元素)
c.begin()返回一个 random-access iterator 指向第一元素
c.end()返回一个 random-access iterator 指向最末元素的下一位置
c.cbegin()返回一个 const random-access iterator 指向第一元素(始自C++11)
c.cend(返回一个 const random-access iterator 指向最末元素的下一位置(始自C++11)
c.rbegin()返回一个反向的 (reverse) iterator 指向反向迭代的第一元素
c.rend()返回一个反向的 (reverse) iterator 指向反向迭代的最末元素的下一位置
c.crbegin()返回一个 const reverse iterator 指向反向迭代的第一元素(始自C++11)
c.crend()返回一个 const reverse iterator 指向反向迭代的最末元素的下一位置(始自C++11)

 
 

 
 

 
 

更易型操作

操作描述
c = c2将 c2 的全部元素赋值给 c
c = rv将 rvalue rv 的所有元素以 move assign 方式给予 c(始自C++11)
c = initlist将初值列 inittist 的所有元素赋值给 c(始自C++11)
c.assign(n, elem)复制 n 个 elem,赋值给 c
c.assign(beg , end)将区间 [beg, end) 内的元素赋值给 c
c.assign(initlist)将初值列 initlist 的所有元素赋值给 c
c1.swap( c2)置换 c1 和 c2 的数据
swap(c1, c2)置换 c1 和 c2 的数据
c.push_back(elem)附加一个 elem 的拷贝于末尾
c.pop_back()移除最后一个元素,但是不返回它
c.push_front(elem)在头部插入 elem 的一个拷贝
c.pop_front()移除第一元素(但不返回)
c.insert(pos, elem)在 iterator 位置 pos 之前方插入一个 elem 拷贝,并返回新元素的位置
c.insert(pos, n, elem)在 iterator 位置 pos 之前方插入 n 个 elem 拷贝,并返回第一个新元素的位置(或返回 pos——如果没有新元素的话)
c.insert(pos, beg, end)在 iterator 位置 pos 之前方插入区间 [beg, end) 内所有元素的一份拷贝,并返回第一个新元素的位置(或返回 pos——如果没有新元素的话)
c.insert(pos, initlist)在 iterator 位置 pos 之前方插入初值列 initlist 内所有元素的一份拷贝,并返回第一个新元素的位置(或返回 pos———如果没有新元素的话;始自C++11)
c.emplace(pos, args . . .)在 iterator 位置 pos 之前方插入一个以 args 为初值的元素,并返回新元素的位置(始自C++11)
c.emplace_back(args . . .)附加一个以 args 为初值的元素于末尾,不返回任何东西(始自C++11)
c.emplace_front(args . . .)插入一个以 args 为初值的元素于起点,不返回任何东西(始自C++11)
c.erase(pos)移除 iterator 位置 pos 上的元素,返回下一元素的位置
c.erase(beg, end)移除 [beg, end) 区间内的所有元素,返回下一元素的位置
c.resize(num)将元素数量改为 num(如果 size() 变大,多出来的新元素都需以 default 构造函数完成初始化)
c.resize(num, elem)将元素数量改为 num(如果 size() 变大,多出来的新元素都是 elem 的拷贝)
c.clear()移除所有元素,将容器清空

 
 

 
 

 
 

使用例子

#include <iostream>
#include <algorithm>
#include <string>
#include <deque>
using namespace std;int main(){deque<string> c;//创建一个空deque c.assign(3, string("qwjy"));//复制3个qwjy复制给c c.push_back("qw");//尾部插入一个元素 c.push_front("qy");//头部插入一个元素 for(int i = 0; i < c.size(); i ++)printf("%s\n", c[i].c_str());printf("\n");c.pop_front();//移除最后一个元素 c.pop_back();//移除第一个元素 for(int i = 0; i < c.size(); i ++)printf("%s\n", c[i].c_str());printf("\n");c[1] = c[1] + "666";for(int i = 0; i < c.size(); i ++)printf("%s\n", c[i].c_str());printf("\n");return 0;
}

运行结果


http://chatgpt.dhexx.cn/article/nKfUdCJ9.shtml

相关文章

C++中deque用法详解

deque函数&#xff1a; deque容器为一个给定类型的元素进行线性处理&#xff0c;像向量一样&#xff0c;它能够快速地随机访问任一个元素&#xff0c;并且能够高效地插入和删除容器的尾部元素。但它又与vector不同&#xff0c;deque支持高效插入和删除容器的头部元素&#xff0…

python中的deque模块(collections的deque模块)

目录 1. deque是python的collections中的一个类 2.deque的简单使用以及它的方法 2.1 创建deque的方法 2.2 创建deque时&#xff0c;并指定大小maxlen&#xff0c;即能装几个元素&#xff0c; 以及deque添加元素append()方法 2.3 deque的 appendleft()方法 2.4 deque的 clear()…

C++中deque的用法(超详细,入门必看)

博主简介&#xff1a;Hello大家好呀&#xff0c;我是陈童学&#xff0c;一个与你一样正在慢慢前行的人。 博主主页&#xff1a;陈童学哦 所属专栏&#xff1a;CSTL 如果本文对你有所帮助的话&#xff0c;希望可以点赞&#x1f44d;收藏&#x1f4c2;支持一下哦&#xff01; 期待…

Java数据结构之Deque

Java数据结构之Deque 引题Deque接口分析Deque的注释与Queue的联系还在使用Stack&#xff1f;你OUT啦&#xff01;peek方法更方便与List的不同与null说goodbye 子类ArrayDeque.class分析基本结构官方的代码图解数据存储过程 简单思考 1部分代码的分析关于初始容量关于扩容代码中…

java关于Deque的使用

定义 双向队列&#xff1a;支持插入删除元素的线性集合。 java官方文档推荐用deque实现栈&#xff08;stack&#xff09;。 和Queue的区别 Deque是double ended queue&#xff0c;将其理解成双端结束的队列&#xff0c;双端队列&#xff0c;可以在首尾插入或删除元素。 Queue的…

【C++】deque的用法

目录 一、容器适配器二、deque的介绍三、deque的使用及缺陷1、deque的构造函数2、deque的元素访问接口3、deque的 iterator的使用4、deque的增删查改4、deque的缺陷5、为什么选择deque作为stack和queue的底层默认容器 一、容器适配器 在了解deque前&#xff0c;我们先讲一讲什…

Python deque的用法介绍

Python deque的用法介绍 deque 是Python标准库 collections 中的一个类&#xff0c;实现了两端都可以操作的队列&#xff0c;相当于双端队列&#xff0c;与Python的基本数据类型列表很相似。 Python实现双端队列参考&#xff1a;https://blog.csdn.net/weixin_43790276/artic…

C++ deque的用法与示例

C deque的用法与示例 deque容器的介绍 Vector 容器是单向开口的连续内存空间&#xff0c;deque 则是一种双向开口的连续线性空间。所谓的双向开口&#xff0c;意思是可以在头尾两端分别做元素的插入和删除操作&#xff0c;当然&#xff0c;vector 容器也可以在头尾两端插入元…

deque用法详解

“无意中发现了一个巨牛的人工智能教程&#xff0c;忍不住分享一下给大家。教程不仅是零基础&#xff0c;通俗易懂&#xff0c;而且非常风趣幽默&#xff0c;像看小说一样&#xff01;觉得太牛了&#xff0c;所以分享给大家。点这里可以跳转到教程。” deque函数&#xff1a; …

deque容器详解

文章目录 1. deque容器基本概念2. deque构造函数3. deque赋值操作4. deque大小操作5. deque插入和删除6. deque数据存取7. deque排序 1. deque容器基本概念 功能&#xff1a; 双端数组&#xff0c;可以对头端进行插入删除操作 deque与vector区别&#xff1a; vector对于头部…

双端队列(Deque)

一、简介 deque&#xff0c;即双端队列(double ended queue)&#xff0c;是一种可以在两端扩展或收缩的序列化容器。 deque是C 标准模板库的一部分&#xff0c;想要使用deque&#xff0c;需要在程序中包含头文件deque。 #include<deque>二、定义和初始化 1.格式&#x…

关于Deque的详解

1. 定义 双向队列&#xff1a;支持插入删除元素的线性集合&#xff1b;java官方文档推荐用deque实现栈&#xff08;stack&#xff09;。 2. 和Queue的区别 Deque是double ended queue&#xff0c;将其理解成双端结束的队列&#xff0c;双端队列&#xff0c;可以在首尾插入或删除…

deque用法深度解析,一篇文章弄懂deque容器各种操作

&#x1f4cb; 前言 &#x1f5b1; 博客主页&#xff1a;在下马农的碎碎念✍ 本文由在下马农原创&#xff0c;首发于CSDN&#x1f4c6; 首发时间&#xff1a;2022/01/11&#x1f4c5; 最近更新时间&#xff1a;2022/01/11&#x1f935; 此马非凡马&#xff0c;房星本是星。向前…

未禁用nouveau导致Ubuntu安装Cuda的runfile安装方法出错:[ERROR]: Install of 455.32.00 failed, quitting

很多朋友在给Ubuntu&#xff08;Linux&#xff09;安装Cuda时&#xff0c;参考官方安装步骤导致安装出错&#xff1a; wget https://developer.download.nvidia.com/compute/cuda/11.1.1/local_installers/cuda_11.1.1_455.32.00_linux.run sudo sh cuda_11.1.1_455.32.00_lin…

Ubuntu 安装 NVIDIA 显卡驱动详细步骤(ERROR: The Nouveau kernel driver is currently in use by your system)

1. 禁用 Nouveau 驱动 在禁用 Nouveau 驱动前我们先了解下它是啥&#xff1f;有什么作用。 Nouveau 是由第三方为 NVIDIA 显卡开发的一个开源 3D 驱动&#xff0c;也没能得到 NVIDIA 的认可与支持。虽然 Nouveau Gallium3D 在游戏速度上还远远无法和 NVIDIA 官方私有驱动相提…

Ubuntu 18.04 安装 nvidia 显卡驱动 离线安装 禁用 nouveau

Ubuntu 18.04 安装 nvidia 显卡驱动 离线安装 1 系统2 查看显卡2.1 更新 pci.ids 文件 3 安装显卡驱动 510.543.1 安装 nvtop 4 禁用 nouveau5 安装 cuda 11.6.15.1 设置环境变量 1 系统 # lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description:…

[Ubuntu]:禁用nouveau、安装卸载NVIDIA CUDA及驱动(深度学习)

这里只针对Ubuntu的安装卸载&#xff0c;安装驱动方式的不同&#xff0c;卸载也有些许不同。通常有3种方式&#xff1a; 通过apt包管理工具来安装&#xff0c; 这样的方式好处是卸载安装的管理跟其他软件一致 通过.deb包来安装&#xff0c;这里就跳过apt&#xff0c;直接使用了…

ubuntu18.04 禁用自带nouveau后重启无法进入系统

问题 按照链接步骤&#xff1a;禁用ubuntu 自带显卡驱动Nouveau&#xff0c; 又按照推荐安装驱动&#xff1a;$ sudo ubuntu-drivers autoinstall&#xff0c;重启电脑后&#xff0c;无法进入系统&#xff0c;一直重复停留在密码输入界面。 解决方法&#xff1a; 开机进入ubun…

Ubuntu20.04(18.04通用)禁用nouveau,安装NVIDIA显卡驱动

卸载其它版本NVIDIA驱动 sudo apt-get --purge remove nvidia*sudo apt autoremove禁掉nouveau 打开文本形式 sudo gedit /etc/modprobe.d/blacklist.conf 或直接终端打开形式 sudo vim /etc/modprobe.d/blacklist.conf sudo vi /etc/modprobe.d/blacklist.conf 在打开的文件…

已解决:ubuntu18.4禁用nouveau驱动(如何关闭secure boot)

在安装显卡驱动等过程中往往会需要禁用bios中的secure boot&#xff0c;因为secure boot会阻止第三方源安装驱动&#xff0c;只要保证安装源可靠&#xff0c;禁用并不会带来多大隐患。 1.开机在未亮屏之前反复按F2进入设置界面 2.取消勾选后退出重启 完成bios中的secure boot禁…