C++ STL — 第6章 STL容器(二)deque

2023-05-16

C++ STL容器deque和vector很类似,也是采用动态数组来管理元素。

使用deque之前需包含头文件:

#include <deque>

它是定义在命名空间std内的一个class template:

template<class _Ty,
class _Ax = allocator<_Ty> >
class deque;

第一个template参数用来表示元素型别,第二个可有可无,指定内存模型。一般使用默认的内存模型。

与vector不同的是deque的动态数组首尾都开放,因此能够在首尾进行快速地插入和删除操作。

deque的逻辑结构:



deque的内部结构

deque是一种优化了的对序列两端元素进行添加和删除操作的基本序列容器。通常由一些独立的区块组成,第一区块朝某方向扩展,最后一个区块朝另一方向扩展。它允许较为快速地随机访问但它不像vector一样把所有对象保存在一个连续的内存块,而是多个连续的内存块。并且在一个映射结构中保存对这些块以及顺序的跟踪。

其内部结构如下图所示:


deque的特点:

1、支持随机访问,即支持[]以及at(),但是性能没有vector好。

2、可以在内部进行插入和删除操作,但性能不及list。


deque和vector的不同之处:

1、两端都能够快速插入和删除元素。vector只能在尾端进行。

2deque的元素存取和迭代器操作会稍微慢一些。因为deque的内部结构会多一个间接过程。

3、迭代器是特殊的智能指针,而不是一般指针。它需要在不同的区块之间跳转。

4deque可以包含更多的元素,其max_size可能更大。因为不止使用一块内存。

5、不支持对容量和内存分配时机的控制。

注意:在除了首尾两端的其他地方插入和删除元素,都将会导致指向deque元素的任何pointersreferencesiterators失效。不过,deque的内存重分配优于vector。因为其内部结构显示不需要复制所有元素。

6deque的内存区块不再被使用时,会被释放。deque的内存大小是可缩减的。不过,是不是这么做以及怎么做由实作版本定义。

 

dequevector相似的特性:

1、在中间部分插入和删除元素相对较慢,因为所有元素都要被移动。

2、迭代器属于随即存取迭代器。

 

最好采用deque的情形:

1、需要在两端插入和删除元素。

2、无需引用容器内的元素。

3、要求容器释放不再使用的元素。

 

deque的操作函数

构造函数和析构函数:

非变动性操作:


变动性操作:



deque的各项操作只有一下两点和vector不同:

deque不提供容量操作:capacity()reverse()

deque直接提供函数完成首尾元素的插入和删除。

其他均与vector相同。

注意:

1、除了at()函数,其他成员函数都不会检查索引或迭代器是否有效。

2、元素的插入和删除可能会导致内存重新分配。所以任何插入或删除操作都会使所有指向deque元素的pointers、reference、iterators失效。唯一例外的是在首尾插入元素之后,pointers和reference可能仍然有效。


#include <iostream>
#include <deque>
#include <string>
#include <algorithm>
#include <iterator>


using namespace std;

int main()
{
	deque<string> strDeq;

	strDeq.assign(4,string("CHINA"));
	strDeq.push_back("first_string");
	strDeq.push_front("last_string");

	copy(strDeq.begin(),strDeq.end(),
		ostream_iterator<string>(cout," "));
	cout << endl;
	cout << endl;

	for(int i = 0;i < strDeq.size();++i)
		cout << "strDeq[" << i << "] : " << strDeq[i] << endl;
	cout << endl;
	
	for(int i = 0;i < strDeq.size();++i)
		cout << "strDeq.at(" << i << ") : " << strDeq.at(i) << endl;
	cout << endl;

	strDeq.pop_front();
	strDeq.pop_back();

	copy(strDeq.begin(),strDeq.end(),
		ostream_iterator<string>(cout," "));
	cout << endl;
	cout << endl;

	for(int i = 1;i < strDeq.size();++i)
		strDeq[i] = "pre" + strDeq[i];
	copy(strDeq.begin(),strDeq.end(),
		ostream_iterator<string>(cout," "));
	cout << endl;
	cout << endl;

	strDeq.resize(4,"resized string");

	copy(strDeq.begin(),strDeq.end(),
		ostream_iterator<string>(cout," "));
	cout << endl;
	cout << endl;
}

运行结果:


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ STL — 第6章 STL容器(二)deque 的相关文章

  • 迭代 C++ 映射中的键

    有没有办法迭代键 而不是 C 映射对 地图是关联容器 因此 迭代器是一对key val 如果您只需要键 则可以忽略该对中的值部分 for std map
  • 二维向量的迭代器

    如何为 2d 向量 向量的向量 创建迭代器 虽然你的问题是not非常清楚 我假设您的意思是 2D 向量表示向量的向量 vector lt vector
  • 如何找到向量中第一个小于整数 X 的元素? (c++)

    如果我有以下向量 10 10 10 20 20 20 30 30 我想要一个函数返回 X 的整数的位置或直接返回 X 之后的较小元素 例如如果我正在搜索 11 我希望函数返回 2 因为第二个元素 10 是第一个较小的元素向量中大于 11 的
  • Windows Unicode C++ 流输出失败

    我目前正在编写一个应用程序 它要求我在任意窗口上调用 GetWindowText 并将该数据存储到文件中以供以后处理 长话短说 我注意到我的工具在 战地 3 上失败了 我将问题范围缩小到窗口标题中的以下字符 http www filefor
  • 使用accumulate计算数组double[]平均值的函数

    它一定是最常见的函数 每个人在某处都有代码片段 但我实际上花了不少于 1 5 小时在 SO 以及其他 C 网站上搜索它 但还没有找到解决方案 我想计算 a 的平均值double array 使用函数 我想将数组作为函数传递给参考 有数百万个
  • uninitialized_copy memcpy/memmove 优化

    我最近开始研究 MSVC 实现中的 STL 那里有一些不错的技巧 但是我不知道为什么使用以下标准 The std uninitialized copy被优化为一个简单的memcpy memmove如果满足某些条件 据我了解 输入范围可以是m
  • 如何将 list 对象附加到另一个对象

    在 C 中 我有两个list
  • 如何避免在 std::pair 中“隐式”调用单参数构造函数

    最初的问题是如何与std map
  • STL迭代器是否保证集合更改后的有效性?

    假设我有某种集合 并且我在它的开头获得了一个迭代器 现在假设我修改了该集合 无论集合或迭代器的类型如何 我仍然可以安全地使用迭代器吗 为了避免混淆 以下是我讨论的操作顺序 获取集合的迭代器 修改集合 显然 不是其中的元素 而是集合本身 使用
  • 为什么 std::set 没有“包含”成员函数?

    我正在大量使用std set
  • C# 等价于 C++ 向量或双端队列

    我几乎可以肯定这应该是重复的 但我搜索了一段时间但找不到答案 我应该在 C 中使用什么来替换 C 向量和双端队列有效率的 也就是说 我需要一种有效支持直接索引的结构 并且还支持以有效的方式再次从一端或两端删除 取决于向量或双端队列的情况 在
  • 在 boost 元组、zip_iterator 等上使用 std::get 和 std::tie

    我有哪些使用选择std get lt gt and std tie lt gt 与增强结构一起 例子 我想使用基于范围的 for 循环在多个容器上进行迭代 我可以实施zip函数 它使用boost zip iterator include
  • 如何将 BOOST_FOREACH 与两个 std::map 一起使用?

    我的代码基本上如下所示 std map
  • std::enable_if 和 std::enable_if_t 有什么区别?

    C 14 引入std enable if t 它和有什么区别std enable if 使用上有什么优点或者区别吗std enable if t std enable if t 是 std enable if 的内部 type 的类型别名
  • std::map 只读操作的线程安全

    我有一个 std map 用于将值 字段 ID 映射到人类可读的字符串 当我的程序在任何其他线程启动之前启动时 该映射会被初始化一次 之后就不会再被修改 现在 我为每个线程提供了这个 相当大的 映射的自己的副本 但这显然是内存使用效率低下
  • 当另一个进程使用 std::fstream 写入文件时从文件读取[重复]

    这个问题在这里已经有答案了 我需要从文件中逐行读取 它是由 std getline 完成的 另一个进程的问题是一直向其附加数据 然后我需要读取新行 例如 文件一开始包含10行 我的程序读取了10行 那么我的程序应该等待 过了一会儿 另一个进
  • std::map 和二叉搜索树

    我读过 std map 是使用二叉搜索树数据结构实现的 BST 是一种顺序数据结构 类似于数组中的元素 它将元素存储在 BST 节点中并按其顺序维护元素 例如如果元素小于节点 则将其存储在节点的左侧 如果元素大于节点 则将其存储在节点的右侧
  • std::vector 迭代器失效

    之前有几个关于这个问题的问题 我的理解是调用std vector erase只会使位于某个位置的迭代器无效after被擦除的元素 然而 擦除一个元素后 该位置的迭代器是否仍然有效 当然 前提是它不指向end 擦除后 我对向量如何实现的理解似
  • C++ 映射插入和查找性能和存储开销

    我想存储一个映射integer的关键float内存中的值 我大约有 1 3 亿个键 相应地 也有 1 3 亿个值 我的重点是查找性能 我必须进行数百万次查找 C STL 库有一个map此类关联数组的类 我有几个问题map 存储开销是多少ma
  • ArrayDeque 和 LinkedBlockingDeque

    只是想知道为什么他们做了一个LinkedBlockingDeque而同一个非并发对应物是ArrayDeque它基于可调整大小的数组 LinkedBlockingQueue使用一组节点 例如LinkedList 尽管没有实施List 我知道可

随机推荐

  • ubuntu 创建新用户并添加到docker组

    useradd myuser passwd myuser first create the directory mkdir p home myuser usermod s bin bash d home myuser myuser cp r
  • SM2 签名前要进行的预处理操作

    一般情况下 xff0c 计算数字签名时应执行以下操作 xff1a 1 计算原始数据的 Hash 值 xff1b 2 将 Hash 值作为输入 xff0c 计算签名函数的输出 并不是对原始数据直接签名 xff0c 而是对 Hash 值签名 验
  • VR行业的发展现状和前景

    5G技术的应用推广 xff0c 加速推动虚拟现实不断发展和完善 xff0c VR产业迅速在各个领域和行业都得到广泛应用 xff0c 最好直观的感受就是知觉体验得到了良好的增强作用 本文的主要内容是简单概括VR技术的发展现状和发展前景 一 V
  • Intel真情告白:我的眼里只有你 –UP Squared Board

    近期 xff0c 物联网领域最大的喜讯莫过于研扬科技携手Intel 共同推出一款 UP SQUARED GROVE 物联网开发套件 对于这次喜结良缘 xff0c Intel 官网也是不加修饰的大方昭告天下 xff1a 我的眼里只有你 xff
  • 【问题与方法】联想拯救者双系统重启卡死机解决方案

    码字不易 xff0c 如果各位看官感觉该文章对你有所帮助 xff0c 麻烦点个关注 xff0c 如果有任何问题 xff0c 请留言交流 如需转载 xff0c 请注明出处 xff0c 谢谢 文章链接 xff1a 问题与方法 联想拯救者双系统重
  • 【深度学习】训练集、测试集和验证集

    码字不易 xff0c 如果各位看官感觉该文章对你有所帮助 xff0c 麻烦点个关注 xff0c 如果有任何问题 xff0c 请留言交流 如需转载 xff0c 请注明出处 xff0c 谢谢 文章链接 xff1a https blog csdn
  • 【深度学习】ubuntu系统指定gcc版本并调整优先级

    sudo apt install build essential gcc version xff08 查看gcc版本 xff09 可以看到我的gcc版本是4 8 5 安装最新版gcc9 sudo apt install software p
  • 【深度学习】Ubuntu增加Swap交换空间大小

    前言 xff1a 做Ubuntu系统时 xff0c 选择了默认空间分配方案 xff0c Swap空间仅2G xff0c 而你的内存有16G xff0c 分给Swap空间至少为内存的1倍 xff0c 最好是内存值的2倍 xff0c 系统相当卡
  • 【论文阅读】Anchor3DLane: Learning to Regress 3D Anchors for Monocular 3D LaneDetection

    Anchor3DLane 针对单目的3D车道线检测去学习回归3D锚 摘要 xff1a 单目的3D车道线检测是一个非常具有挑战性的问题 xff0c 因为他缺少深度的信息 xff0c 3D车道线检测一个非常流行的方法是将前视图转换成鸟瞰图 xf
  • 【深度学习】训练模型结果同时显示,模型结果对比

    码字不易 xff0c 如果各位看官感觉该文章对你有所帮助 xff0c 麻烦点个关注 xff0c 如果有任何问题 xff0c 请留言交流 如需转载 xff0c 请注明出处 xff0c 谢谢 文章链接 xff1a 深度学习 训练模型结果同时显示
  • 【问题与方法】如何使用vscode配置远程git仓库

    码字不易 xff0c 如果各位看官感觉该文章对你有所帮助 xff0c 麻烦点个关注 xff0c 如果有任何问题 xff0c 请留言交流 如需转载 xff0c 请注明出处 xff0c 谢谢 配置git xff0c 看我这一篇其实就够了 问题与
  • 【车道线算法】GANet-车道线检测环境配置一文通关

    目录 GANet配置全纪录 下载代码 conda环境部署 安装torch和cudatoolkit 安装其他包 编译 总结 GANet配置全纪录 下载代码 GitHub Wolfwjs GANet A Keypoint based Globa
  • 【雷达】如何将三维点云映射到二维平面

    最近在做基于雷达点云的交通标识牌识别时 xff0c 需要按照HAD格式进行输出 xff0c 由于交通标识牌不一定会与坐标轴垂直 xff0c 那么如何找到矩形标识牌的四个顶点 xff0c 是待解决的问题 由于标识牌一定是平面的 xff0c 三
  • ceres 拟合曲线

    假设有一条满足以下方程的曲线 xff1a 其中a b c为曲线的参数 xff0c w为高斯噪声 这是一个非线性模型 假设我们有N个关于x y的观测数据点 xff0c 想根据这些数据点求出曲线的参数 那么 xff0c 可以求解下面的最小二乘问
  • 独家!了不起的UP系列产品,不一样的开发板—UP Board(一)

    AAEON自2016年推出第一代UP board问世以来 xff0c 其信用卡大小的苗条小身材 xff08 世界首创Intel平台信用卡大小开发板 xff09 xff0c 配备上Intel Atom x5 z8350 处理器 xff0c 兼
  • 追求技术之路 - 那些陪伴我的书籍

    如今已经在广州一家嵌入式公司实习 xff0c 分享大学里度过的一些书籍 xff0c 有些还没读完 xff0c 个人比较喜欢经典书籍 xff0c 研读起来就有种奇妙的感觉 xff0c 比起人与人之间的复杂的关系 xff0c 书籍带给我的感觉很
  • 编程之美 -- 中国象棋将帅问题

    下过中国象棋的朋友都知道 xff0c 双方的 将 和 帅 相隔遥远 xff0c 并且它们不能照面 在象棋残局中 xff0c 许多高手能利用这一规则走出精妙的杀招 假设棋盘上只有 将 和 帅 二子 xff08 为了下面叙述方便 xff0c 我
  • C++单元测试工具 -- CppUnit

    CppUnit 作为C 43 43 语言的一款测试工具 xff0c 其实也是一个开源项目 xff0c 与JUnit一样 xff0c 用来方便开发人员进行单元测试的工具 项目地址 xff1a http sourceforge net apps
  • 拒绝游戏!发愤图强!

    立帖为证 xff01 xff01 xff01
  • C++ STL — 第6章 STL容器(二)deque

    C 43 43 STL容器deque和vector很类似 xff0c 也是采用动态数组来管理元素 使用deque之前需包含头文件 xff1a include lt deque gt 它是定义在命名空间std内的一个class templat