详解c++STL—容器deque

2023-11-17

目录

1、deque容器的基本概念

1.1、功能

1.2、deque与vector区别

1.3、deque内部工作原理

2、deque构造函数

2.1、功能描述

2.2、函数原型

2.3、示例

3、deque赋值操作

3.1、功能描述

3.2、函数原型

3.3、示例

4、deque大小操作

4.1、功能描述

4.2、函数原型

4.3、示例

5、deque插入和删除

5.1、 功能描述

5.2、函数原型

5.3、示例

6、deque数据存取

6.1、功能描述

6.2、函数原型

6.3、示例

7、deque排序

7.1、功能描述

7.2、算法

7.3、示例


1、deque容器的基本概念

1.1、功能

  • 双端数组,可以对头端进行插入删除操作

1.2、deque与vector区别

  • vector对于头部的插入删除效率低,数据量越大,效率越低
  • deque相对而言,对头部的插入删除速度回比vector快
  • vector访问元素时的速度会比deque快,这和两者内部实现有关

1.3、deque内部工作原理

deque内部有个中控器,维护每段缓冲区中的内容,缓冲区中存放真实数据

中控器维护的是每个缓冲区的地址,使得使用deque时像一片连续的内存空间

deque容器的迭代器也是支持随机访问

2、deque构造函数

2.1、功能描述

  • deque容器构造

2.2、函数原型

  • deque<T> deqT; //默认构造形式
  • deque(beg, end); //构造函数将[beg, end)区间中的元素拷贝给本身。
  • deque(n, elem); //构造函数将n个elem拷贝给本身。
  • deque(const deque &deq); //拷贝构造函数

2.3、示例

//deque构造函数
void myprint(const deque<int> d) {
	for (deque<int>::const_iterator it = d.begin(); it != d.end();it++) {
		/**it = 10;*/
		cout << *it << " ";
	}
	cout << endl;
}


void test01() {

	//1、默认构造
	deque<int> d;
	for (int i = 0; i < 10; i++) {
		d.push_back(i);
	}
	myprint(d);

	//2、区间构造
	deque<int> d1(d.begin(),d.end());
	myprint(d1);

	//3、n个elem构造
	deque<int> d2(10,100);
	myprint(d2);

	//4、拷贝构造
	deque<int> d3(d2);
	myprint(d3);


}

int main() {
	test01();
	system("pause");
	return 0;
}

3、deque赋值操作

3.1、功能描述

  • 给deque容器进行赋值

3.2、函数原型

  • deque& operator=(const deque &deq); //重载等号操作符
  • assign(beg, end); //将[beg, end)区间中的数据拷贝赋值给本身。
  • assign(n, elem); //将n个elem拷贝赋值给本身。

3.3、示例

//deque赋值
void myprint(const deque<int> d) {
	for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++) {
		/**it = 10;*/
		cout << *it << " ";
	}
	cout << endl;
}


void test01() {

	deque<int> d;
	for (int i = 0; i < 10; i++) {
		d.push_back(i);
	}
	myprint(d);

	//1、等号赋值
	deque<int> d1;
	d1 = d;
	myprint(d1);

	//2、assign区间赋值
	deque<int> d2;
	d2.assign(d1.begin(),d1.end());
	myprint(d2);

	//3、assign,n个elem赋值
	deque<int> d3;
	d3.assign(10,100);
	myprint(d3);

}

int main() {
	test01();
	system("pause");
	return 0;
}

4、deque大小操作

4.1、功能描述

  • 对deque容器的大小进行操作

4.2、函数原型

  • deque.empty(); //判断容器是否为空
  • deque.size(); //返回容器中元素的个数
  • deque.resize(num);
  • //重新指定容器的长度为num,若容器变长,则以默认值填充新位置。//如果容器变短,则末尾超出容器长度的元素被删除。
  • deque.resize(num, elem);
  • //重新指定容器的长度为num,若容器变长,则以elem值填充新位置。//如果容器变短,则末尾超出容器长度的元素被删除。

4.3、示例

//deque大小操作
void myprint(const deque<int> d) {
	for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++) {
		cout << *it << " ";
	}
	cout << endl;
}

void test01() {

	deque<int> d;
	for (int i = 0; i < 10; i++) {
		d.push_back(i);
	}
	myprint(d);

	//1、判断是否为空
	if (d.empty()) {
		cout << "d,为空" << endl;
	}
	else {
		cout << "d,不为空" << endl;
		//2、输出容器大小
		cout << "d,大小为:" << d.size() << endl;
	}

	//3、改变大小,空缺默认用0填充
	d.resize(15);
	myprint(d);

	//4、改变大小,设定空缺用1填充
	d.resize(20,1);
	myprint(d);

	//5、改变大小,过小发生截断
	d.resize(5);
	myprint(d);
}

int main() {
	test01();
	system("pause");
	return 0;
}

注意:deque没有容量的概念

5、deque插入和删除

5.1、 功能描述

  • 向deque容器中插入和删除数据

5.2、函数原型

两端插入操作:

  • push_back(elem); //在容器尾部添加一个数据
  • push_front(elem); //在容器头部插入一个数据
  • pop_back(); //删除容器最后一个数据
  • pop_front(); //删除容器第一个数据

指定位置操作:

  • insert(pos,elem); //在pos位置插入一个elem元素的拷贝,返回新数据的位置。
  • insert(pos,n,elem); //在pos位置插入n个elem数据,无返回值。
  • insert(pos,beg,end); //在pos位置插入[beg,end)区间的数据,无返回值。
  • clear(); //清空容器的所有数据
  • erase(beg,end); //删除[beg,end)区间的数据,返回下一个数据的位置。
  • erase(pos); //删除pos位置的数据,返回下一个数据的位置。

5.3、示例

//deque大小操作
void myPrint(const deque<int> d) {
	for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++) {
		cout << *it << " ";
	}
	cout << endl;
}

//两端操作
void test01() {

	deque<int> d;
	//尾插尾删
	d.push_back(10);
	d.push_back(20);
	d.push_back(30);
	d.pop_back();
	myPrint(d);

	//头插头删
	d.push_front(40);
	d.push_front(50);
	d.push_front(60);
	d.pop_front();
	myPrint(d);

}

//指定位置操作
void test02() {
	deque<int> d1;
	d1.push_back(10);
	d1.push_back(20);
	d1.push_back(30);
	d1.push_back(40);
	myPrint(d1);

	//1、指定位置插入一个值
	d1.insert(d1.begin(),50);
	myPrint(d1);

	//2、指定位置插入多个相同值
	d1.insert(d1.end(), 2, 60);
	myPrint(d1);

	//3、指定位置插入一个区间
	deque<int> d2;
	d2.push_back(1);
	d2.push_back(2);
	d2.push_back(3);

	d1.insert(d1.begin(),d2.begin(),d2.end());
	myPrint(d1);

}

//删除操作
void test03() {
	deque<int> d1;
	d1.push_back(10);
	d1.push_back(20);
	d1.push_back(30);
	d1.push_back(40);
	myPrint(d1);

	//1、指定位置删除,返回下一个数据的位置
	d1.erase(d1.begin());
	myPrint(d1);
	
	//2、指定区间删除,返回下一个数据的位置
	//如果区间为【begin,end】,等价于 clear()
	d1.erase(d1.begin(),d1.end());
	myPrint(d1);

	//3、清空
	d1.clear();
	myPrint(d1);

}

int main() {
	//test01();

	//test02();
	test03();
	system("pause");
	return 0;
}

6、deque数据存取

6.1、功能描述

  • 对deque 中的数据的存取操作

6.2、函数原型

  • at(int idx); //返回索引idx所指的数据
  • operator[]; //返回索引idx所指的数据
  • front(); //返回容器中第一个数据元素
  • back(); //返回容器中最后一个数据元素

6.3、示例

//deque容器的存取
void test01() {
	deque<int> d;
	d.push_back(10);
	d.push_back(20);
	d.push_back(30);
	d.push_back(40);
	d.push_back(50);

	//1、[]存取
	for (int i = 0; i < d.size();i++) {
		cout << d[i] << " ";
	}
	cout << endl;

	//2、at()存取
	for (int i = 0; i < d.size(); i++) {
		cout << d.at(i) << " ";
	}
	cout << endl;

	//3、front(),返回第一个
	int ret = d.front();
	cout << ret << endl;

	//4、back(),返回最后一个
	ret = d.back();
	cout << ret << endl;

}

int main() {
	test01();
}

7、deque排序

7.1、功能描述

  • 利用算法实现对deque容器进行排序

7.2、算法

  • sort(iterator beg, iterator end); //对beg和end区间内元素进行排序

7.3、示例

//deque容器的存取
void myPrint(const deque<int> d) {
	for(int i = 0; i < d.size(); i++) {
		cout << d[i] << " ";
	}
	cout << endl;
}

void test01() {
	deque<int> d;
	d.push_back(50);
	d.push_back(40);
	d.push_back(30);
	d.push_back(20);
	d.push_back(10);

	cout << "排序前:";
	myPrint(d);

	//默认升序
	sort(d.begin(),d.end());
	cout << "排序后:";
	myPrint(d);

}

int main() {
	test01();
}

注意事项:

1、sort()默认升序排序

2、对于支持随机访问的迭代器的容器,都可以用sort()排序,如vector

3、使用sort()时,需要包含头文件<algorithm>

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

详解c++STL—容器deque 的相关文章

随机推荐

  • 五、Linux系统中的用户管理

    五 Linux系统中的用户管理 5 1 用户及用户组存在的意义 5 1 1 用户存在的意义 系统资源是有限的 如何合理分配系统资源 在这个问题解决时必须要有连个资源配合 1 身份 account 2 授权author 3 认证auth 3A
  • JS算法--整数反转

    1 需求介绍 给出一个 32 位的有符号整数 需要将这个整数中每位上的数字进行反转 注意 假设我们的环境只能存储得下 32 位的有符号整数 则其数值范围为 231 231 1 请根据这个假设 如果反转后整数溢出那么就返回 0 反转什么鬼 举
  • matlab 生成不重复的随机整数 打乱数据排列 生成深度学习数据集

    Matlab自带函数randperm n 可以产生1到n的整数的无重复的随机排列 利用它就可以得到无重复的随机数 例如 randperm n 产生一个1到n的随机顺序 gt gt randperm 10 ans 6 4 8 9 3 5 7
  • 人脸识别正则化系列之normface

    今天介绍一下NormFace L2 Hypersphere Embedding for Face Verification Motivation 希望利用正则化解决两个问题 1 人脸识别任务里面的loss有softmax contrasti
  • 【四】3D Object Model之创建Creation——read_object_model_3d()算子

    欢迎来到本博客 Halcon算子太多 学习查找都没有系统的学习查找路径 本专栏主要分享Halcon各类算子含义及用法 有时间会更新具体案例 具体食用方式 可以点击本专栏 Halcon算子快速查找 gt 搜索你要查询的算子名称 或者点击Hal
  • 9 款值得您花钱的最佳 PDF 编辑器

    PDF 格式在 90 年代初一推出就开始流行 PDF 文件便于携带 易于共享 阅读有趣 但难以编辑 有什么不喜欢的呢 与其他格式相比 无论大小的企业都更喜欢 PDF 因为他们不喜欢其他人篡改他们的文档 无论是指南 职业道德还是展示新产品功能
  • MySQL数据库基础操作—DML

    文章目录 DML的基本介绍 1 1数据插入 1 2数据修改 1 3 数据删除 注意 DML的基本介绍 DML是指数据库操作语言 全称是Data Manipulate Language 作用是对数据库中表的数据记录进行更新 关键字 插入ins
  • 区块链技术的主要特征有哪些

    区块链技术的主要特征有 1 去中心化 2 开放性 3 独立性 4 安全性 5 匿名性 从本质上讲 区块链是一个共享数据库 存储于其中的数据或信息 具有不可伪造 全程留痕 公开透明和集体维护等特征 区块链技术的特征 去中心化 区块链技术不依赖
  • Element ui中menu组件(el-menu/el-menu-item/el-submenu/template) 层级结构和用法

    此篇文章写下的时间是2020年 所以如今Element UI都更新了不知道多少版了 肯定会有些许变化 请勿完全照搬照抄 虽然可能这部分代码没什么大的变动 但还是要以官方文档为准 此文仅仅是借鉴 理解具体思路 然后再按照官方的例子来应用到自己
  • 软件工程——第7章实现知识点整理

    本专栏是博主个人笔记 主要目的是利用碎片化的时间来记忆软工知识点 特此声明 文章目录 1 实现由哪两个部分组成
  • C语言:动态内存(一篇拿捏动态内存!)

    目录 学习目标 为什么存在动态内存分配 动态内存函数 1 malloc 和 free 2 calloc 3 realloc 常见的动态内存错误 1 对NULL指针的解引用操作 2 对动态开辟空间的越界访问 3 对非动态开辟内存使用free释
  • 【ELK】kibana的Saved Objects导入脚本

    快速导入命令 curl XPOST http 192 168 1 1 5601 api kibana dashboards import H Content Type application json H kbn xsrf reportin
  • pip安装软件包报错: error subprocess-exited-with-error问题记录

    问题修复 执行pip install dlib 在执行pip3 install virtualenvwrapper也会报同样的错误 问题修复 我们需要执行如下命令 pip install upgrade setuptools pip ins
  • Maven 项目模板学习

    目录 Maven 项目模板 什么是 archetype 使用项目模板 Maven 将询问原型的版本 创建的项目 创建 pom xml Maven 项目文档 Maven 快照 SNAPSHOT 什么是快照 项目快照 vs 版本 app ui
  • Markdown常用语法记录

    Markdown 语法整理汇总 加粗斜体 加粗 符号 加粗 如 加粗 斜体 符号 斜体 如 斜体 斜体 粗体 符号 斜体 粗体 如 斜体 加粗体 目录 目录 符号 toc 标题 标题 符号 标题内容 几个 代表几级标题 列表 有序列表 符号
  • JavaScript-中的转义字符,\ 反斜杠的使用,如何同时使用多对单引号或双引号

    JS中的转义字符是反斜杠 常用的转义字符有 n r t 等 在 JS 代码中 成对的单引号 不能多对同时使用 双引号也是 如果同时使用多对单引号或双引号就会报错 提示有意外的字符 变量的值使用了多对单引号 原本是想让 单引号 三个字显示带有
  • TensorFlow学习(3)初始化&非饱和激活函数&批量归一化&梯度剪裁&迁移学习&优化器

    1 初始化 默认情况下使用Glorot初始化 1 1 使用其他初始化 1 lecun kernel initializer lecun normal 2 he初始化 kernel initializer he normal 2 非饱和激活函
  • 如何简单实现可执行文件的自我删除

    可执行文件即 EXE 文件在运行过程中 由系统管理其打开的句柄 此时对该文件的一些操作是被系统禁止的 比如删除操作 然而在某些场合 可能须要程序有自我删除的功能 也就是程序运行结束后删除自身 基于这个想法 可以有一种很简单的方法来实现这个基
  • g2o运行时出现段错误segmentation fault

    问题描述 在Ubuntu 18 04上跑orbslam2程序 能够顺利运行orbslam2源码 但在自己新增了一段g2o优化的代码后 运行时出现段错误 错误触发于执行优化时 optimizer initializeOptimization
  • 详解c++STL—容器deque

    目录 1 deque容器的基本概念 1 1 功能 1 2 deque与vector区别 1 3 deque内部工作原理 2 deque构造函数 2 1 功能描述 2 2 函数原型 2 3 示例 3 deque赋值操作 3 1 功能描述 3