详解c++STL—容器deque

news2024/11/15 12:48:07

目录

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>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/535863.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据分析10——Pandas中格式化/分组聚合

0、前言&#xff1a; numpy是生成和处理array类型矩阵数据的工具&#xff0c;而pandas中的series&#xff08;一维矩阵&#xff09;和dataframe&#xff08;二维矩阵&#xff09;数据类型可以来自numpy生成的数据&#xff0c;pandas的重要之处在于他可以导入和处理多种格式类型…

GPT大语言模型Alpaca-lora本地化部署实践【大语言模型实践一】 | 京东云技术团队

模型介绍 Alpaca模型是斯坦福大学研发的LLM&#xff08;Large Language Model&#xff0c;大语言&#xff09;开源模型&#xff0c;是一个在52K指令上从LLaMA 7B&#xff08;Meta公司开源的7B&#xff09;模型微调而来&#xff0c;具有70亿的模型参数&#xff08;模型参数越大…

Pinia 上手使用(store、state、getters、actions)

参考链接&#xff1a;https://juejin.cn/post/7121209657678364685 Pinia官方&#xff1a;https://pinia.vuejs.org/zh/introduction.html 一、安装 npm i pinia -S二、main.js 引入 import { createApp } from "vue" import App from "./App.vue" impor…

[FMC152]AD9208的2 路2GSPS/2.6GSPS/3GSPS 14bit AD 采集FMC 子卡模块中文版本设计资料及调试经验

板卡概述 FMC152 是一款基于VITA57.1 标准的&#xff0c;实现2 路14-bit、2GSPS/2.6GSPS/3GSPS AD 采集FMC 子卡模块。该模块可直接与FPGA 载卡配合使用&#xff0c;板卡ADC 器件采用ADI 公司的AD9208 芯片&#xff0c;&#xff0c;与ADI 公司的AD9689 可以实现PIN 脚兼容。该…

Android平台如何实现外部RTSP|RTMP流注入轻量级RTSP服务模块(内网RTSP网关)

技术背景 今天分享的是外部RTSP或RTMP流&#xff0c;拉取后注入到本地轻量级RTSP服务模块&#xff0c;供内网小并发场景下使用&#xff0c;这里我们叫做内网RTSP网关模块。 内网RTSP网关模块&#xff0c;系内置轻量级RTSP服务模块扩展&#xff0c;完成外部RTSP/RTMP数据拉取并…

挖呀挖和ChatGPT-UMLChina建模知识竞赛第4赛季第1轮

DDD领域驱动设计批评文集>> 《软件方法》强化自测题集>> 《软件方法》各章合集>> 参考潘加宇在《软件方法》和UMLChina公众号文章中发表的内容作答。在本文下留言回答&#xff0c;先全部答对者得分&#xff0c;本轮总分为3分。 1. [单选] 以黄老师版“挖…

opengauss 的回归测试

目录 一、回归测试说明 二、单独执行测试用例&#xff08;开发调试&#xff09; 一、回归测试说明 opengauss/postgresql 的回归测试&#xff0c;通过执行SQL比较输出打印&#xff0c;判断代码修改是否改变了其它功能逻辑。 OG的回归测试大体上和PG类似&#xff0c;主要是通…

wordpress服务器搬家和更换域名的几个步骤

问题解说 其实wordpress换域名需要到数据库进行操作的,首先,你换域名也是有几种情况的; 换空间换域名 如果是上述问题,那么将FTP整站打包外,还需要将数据库里的所有数据表也打包,数据库是进phpmyadmin里打包的,两个都打包后,然后分别上传到新的空间ftp和数据库里,然…

什么是投入产出比(ROI)以及如何提升投入产出比?

投入产出比&#xff08;ROI&#xff09;是一种衡量企业或项目投资效益的指标&#xff0c;它可以帮助企业评估投资回报情况&#xff0c;并制定更加明智的投资决策。本文将为大家介绍什么是投入产出比&#xff08;ROI&#xff09;以及如何提升投入产出比。 一、什么是投入产出比&…

【计算机网络 - 第四章】网络层:数据平面

目录 一、网络层概述 1、主要作用 2、控制平面方法 3、网络层提供的两种服务 二、路由器工作原理 1、路由器总体结构 2、输入、输出端口处理 &#xff08;1&#xff09;输入端口 &#xff08;2&#xff09;输出端口 3、交换 &#xff08;1&#xff09;经内存交换 &…

后端实习产出--通过自定义注解、反射、进行切面编程实现一个转化工具

前置知识&#xff1a; 需要会自定义注解方法自定义注解字段AOP切面编程&#xff0c;反射等... 核心代码结构&#xff1a; 核心代码实现&#xff1a; package com.***.config;import cn.hutool.core.util.StrUtil; import com.google.common.collect.Maps; import com.***.co…

【pyq文案】可可爱爱の朋友圈文案

1.我在该生儿育女的年纪&#xff0c;选择了生椰拿铁 2.我妈年轻时候工资2000&#xff0c;我现在工资也2000&#xff0c;这就叫薪火相传 3.不要讨厌自己&#xff0c;有什么事怪星座生肖八字和mbti就好了 4.人是会和动物共情的&#xff0c;我开始理解急每天早起&#xff0c;然…

FL Studio2023最新中文免费版水果音乐制作软件

FL Studio(水果音乐制作软件)是一款强大的音乐制作编曲软件&#xff0c;非常容易上手。FL让你的计算机就像是全功能的录音室&#xff0c;漂亮的大混音盘&#xff0c;先进的创作工具&#xff0c;让你的音乐突破想象力的限制。一款强大的音乐制作软件&#xff0c;可以进行音乐编曲…

云计算期中测试

云计算期中测试 文章目录 云计算期中测试一、前言二、第一题1、命令方式2、java API方式 三、第二题1、创建CSV文件并将其上传到HDFS2、编写利用MapReduce框架的java代码3、打包java项目4、在Hadoop集群上提交jar文件来运行MapReduce作业 一、前言 在实验开始之前我们需要在虚…

MySQL高级_第05章_存储引擎

MySQL高级_第05章_存储引擎 1. 查看存储引擎 查看mysql提供什么存储引擎&#xff1a; show engines ; show engines \G ; 显式如下&#xff1a; *************************** 1. row *************************** Engine : InnoDB Support: DEFAULT Comment : Su…

企业管理OA系统在企业数字化转型中带来的变化,简直难以想象

目前企业管理面临到哪些痛点 1.信息孤岛&#xff1a;企业内部信息流动不畅&#xff0c;各部门数据独立&#xff0c;互相之间信息难以共享和沟通。 2.流程繁琐&#xff1a;企业业务流程较为繁琐&#xff0c;审批流程漫长&#xff0c;给业务员和经理带来不必要的工作压力。 3.…

Hbase入门篇03---Java API使用,HBase高可用配置和架构设计

Hbase入门篇03---Java API使用&#xff0c;HBase高可用配置和架构设计 需求环境搭建表的CRUD坑命令执行卡住不动 &#xff1f;RegionServer只在本地127.0.0.1监听16020端口导致外网连接被拒RegionServer所在主机的/etc/hosts文件存在额外的回环地址映射信息,导致客户端拿到无法…

亚马逊云科技使用Inf2实例运行GPT-J-6B模型

在2019年的亚马逊云科技re:Invent上&#xff0c;亚马逊云科技发布了Inferentia芯片和Inf1实例这两个基础设施。Inferentia是一种高性能机器学习推理芯片&#xff0c;由亚马逊云科技定制设计&#xff0c;其目的是提供具有成本效益的大规模低延迟预测。时隔四年&#xff0c;2023年…

生成bean的注解@Component极其衍生和@ComponentScan@Configuration

Component Spring 2.5 以后&#xff0c;除了提供基本的 Component 注解之外&#xff0c;还提供了 Service Controller Repository 三个注解。在 Spring 源码中&#xff0c;后面三个注解都在开始部分引入了 Component 注解&#xff0c;除此以外这四个注解的源码内容没有任何区别…

Json介绍

文章目录 1. 什么是 JSON&#xff1f;2. JSON语法格式3. JSON在Java中的用途3.1 FastJSON1. FastJSON概述与下载2. FastJSON常用方法 3.2. Jackson1. Jackson下载与使用2. Jackson常用类与方法3. ObjectMapper类常用方法 1. 什么是 JSON&#xff1f; JSON:JavaScript Object N…