Day09 C++STL入门基础知识六——deque容器 构造函数-赋值操作-大小操作-插入删除-数据存储-排序操作【全面深度剖析+例题代码展示】

news2024/11/27 23:47:13

无人问津的日子,我为自己喝彩!

文章目录

  • 1. 基本概念
    • 1.1 功能
    • 1.2 与`vector`区别
    • 1.3 图解
    • 1.4 内部工作原理
    • 1.5 `deque` 容器的迭代器也是支持随机访问的
  • 2. 构造函数
    • 2.1 函数原型
    • 2.2 代码展示
    • 2.3 测试结果
    • 2.4 小think
      • 2.4.1 小问题
      • 2.4.2 思路
      • 2.4.3 修改
      • 2.4.4 测试
  • 3. 赋值操作
    • 3.1 函数原型
      • 3.2 代码展示
      • 3.3 测试结果
  • 4. 大小操作
    • 4.1 函数原型
    • 4.2 代码展示
    • 4.3 测试结果
  • 5. 插入操作
    • 5.1 两端插入操作
      • 5.1.1 函数原型
      • 5.1.2 代码展示
      • 5.1.3 测试结果
    • 5.2 指定位置操作
      • 5.2.1 函数原型
    • 5.2.2 代码展示
      • 5.2.3 测试结果
  • 6. 删除操作
    • 6.1 函数原型
    • 6.2 代码展示
    • 6.3 测试结果
  • 7. 数据存取操作
    • 7.1 函数原型
    • 7.2 代码展示
    • 7.3 测试结果
  • 8. 排序操作
    • 8.1 sort算法
    • 8.2 代码展示
    • 8.3 测试结果
  • 9. 明日计划
  • 10. 感谢大家支持!!!😉😉😉

1. 基本概念

1.1 功能

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

1.2 与vector区别

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

1.3 图解

在这里插入图片描述

1.4 内部工作原理

  • deque内部有一个中控器维护每段缓冲区中的内容缓冲区中存放真实的数据
  • 中控器维护的是每个缓冲区的地址,使得使用deque时像一片连续的内存空间
    在这里插入图片描述
    在这里插入图片描述

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

2. 构造函数

2.1 函数原型

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

2.2 代码展示

#include<deque>
#include<iostream>
#include<stdio.h>
using namespace std;

void printDeque(const deque<int> d) { //遍历打印输出
	for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++) {
		cout << (*it) << " ";
	}
	cout << endl;
}
void text01() {
	deque<int> d1;
	for (int i = 0; i < 10; i++) {
		d1.push_back(i);
	}
	cout << "d1=";
	printDeque(d1);

	//构造函数将d1元素拷贝给d2
	deque<int>d2(d1.begin(),d1.end());
	cout << "d2=";
	printDeque(d2);
	
	deque<int>d3(10, 3);
	cout << "d3=";
	printDeque(d3);

	deque<int>d4(d3);
	cout << "d4=";
	printDeque(d4);

}

int main() {
	text01();
	return 0;
}

2.3 测试结果

在这里插入图片描述

2.4 小think

2.4.1 小问题

我们知道,迭代器可以对容器中的数据进行读写操作,通过迭代器it我们可以读取容器中的元素,但可能不经意之间也会对其修改。但如何才能只读取并避免进行修改呢???

2.4.2 思路

  1. 当我们用const限制传入的deque的地址时,会发现报错了捏——不存在……的转换
    在这里插入图片描述
  2. 此时我们分析报错内容,大概就是不存在const_iterator到iterator的转换,也就是传入时的迭代器就是const只能读取不能修改的,所以使用时也应是只读迭代器,而不是普通的迭代器。
    在这里插入图片描述

2.4.3 修改

当我们把迭代器改为只读迭代器时,发现不再报错了欸
在这里插入图片描述

2.4.4 测试

当我们尝试用迭代器对数据进行修改时,发现报错了——表达式必须是可修改的左值,也就是该迭代器访问数据时,只能读取,不能修改,我们的目的达到了!!
在这里插入图片描述

3. 赋值操作

鉴于dequevector的赋值操作基本类似,本篇就不详细讲了,带着大家敲击行代码就好了,详细内容请见👉👉👉 Day07 C++STL入门基础知识四——vector容器(上) 基本概念-构造函数-赋值操作-容量大小【全面深度剖析+例题代码展示】eiO

3.1 函数原型

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

3.2 代码展示

#include<deque>
#include<iostream>
#include<stdio.h>
using namespace std;

void printDeque(const deque<int> d) { //遍历打印输出
	for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++) {
		cout << (*it) << " ";
	}
	cout << endl;
}
void text02() {
	deque<int>d1;
	for (int i = 0; i < 10; i++) {
		d1.push_back(i);
	}
	
	//=赋值
	deque<int>d2;
	d2 = d1;
	cout << "d2=";
	printDeque(d2);
	
	//assign赋值
	deque<int>d3;
	d3.assign(d1.begin() + 2, d1.end());
	cout << "d3=";
	printDeque(d3);

	//n个ele赋值
	deque<int>d4;
	d4.assign(10, 4);
	cout << "d4=";
	printDeque(d4);

}

int main() {
	//text01();
	text02();
	return 0;
}

3.3 测试结果

在这里插入图片描述

4. 大小操作

4.1 函数原型

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

vecor不同,deque双端数组,所以可以在头尾两端无限插入读取数据,所以就没有固定的容量

4.2 代码展示

#include<deque>
#include<iostream>
#include<stdio.h>
using namespace std;

void printDeque(const deque<int> d) { //遍历打印输出
	for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++) {
		cout << (*it) << " ";
	}
	cout << endl;
}
//deque容器大小操作
void text03() {
	deque<int> d1;
	for (int i = 0; i < 10; i++) {
		d1.push_back(i);
	}
	printDeque(d1);

	//判空
	if (d1.empty())
		cout << "d1为空" << endl;
	else
		cout << "d1为非空" << endl;
	
	//大小
	int size = d1.size();
	cout << "d1的大小为:" << size << endl;

	//重新指定大小【扩大】
	d1.resize(15);
	cout << "个数扩大为15时:";
	printDeque(d1);

	//重载指定大小
	d1.resize(20, 123);
	cout << "重载扩大为20时:";
	printDeque(d1);

	//重新指定大小【缩小】
	d1.resize(8);
	cout << "缩小为8时:";
	printDeque(d1);
}

int main() {
	//text01();
	//text02();
	text03();
	return 0;
}

4.3 测试结果

在这里插入图片描述

5. 插入操作

5.1 两端插入操作

5.1.1 函数原型

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

5.1.2 代码展示

#include<deque>
#include<iostream>
#include<stdio.h>
using namespace std;

void printDeque(const deque<int> d) { //遍历打印输出
	for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++) {
		cout << (*it) << " ";
	}
	cout << endl;
}
void text04() {
	deque<int>d1;
	
	//尾插
	d1.push_back(10);
	d1.push_back(20);
	d1.push_back(30);	
	printDeque(d1);  //10 20 30

	//头插
	d1.push_front(5);
	d1.push_front(0);
	printDeque(d1);  //0 5  10 20 30 

	//尾删
	d1.pop_back();  
	printDeque(d1);  // 0  5  10  20   

	//头删
	d1.pop_front();
	printDeque(d1);  //5  10  20
}

int main(){
	text04();
	return 0;
}

5.1.3 测试结果

在这里插入图片描述

5.2 指定位置操作

5.2.1 函数原型

  • insert(pos,elem); 在pos位置插入一个elem元素拷贝,返回新数据的位置
  • insert(pos, n, elem); 在pos位置插入n个elem数据,无返回值
  • insert(pos, beg, end); 在pos位置插入[beg, end)区间的数据,无返回值

5.2.2 代码展示

#include<deque>
#include<iostream>
#include<stdio.h>
using namespace std;

void printDeque(const deque<int> d) { //遍历打印输出
	for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++) {
		cout << (*it) << " ";
	}
	cout << endl;
}
void text05() {
	deque<int> d1;
	d1.push_back(10);
	d1.push_back(20);
	d1.push_front(100);
	d1.push_front(200);
	printDeque(d1);
	//200 100 20 10

	//insert插入
	d1.insert(d1.begin(), 400);
	printDeque(d1);

	//insert重载
	d1.insert(d1.begin(), 2, 600);
	printDeque(d1);

	//insert区间插入
	deque<int>d2;
	d2.push_back(1);
	d2.push_back(2);
	d2.push_back(3);

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

}
int main(){
	text05();
	return 0;
}

5.2.3 测试结果

在这里插入图片描述

6. 删除操作

6.1 函数原型

  • clear(); 清空容器所有数据
  • erase(beg, end); 删除[beg,end)区间的数据,返回下一个数据的位置
  • erase(pos); 删除pos位置的数据,返回下一个数据的位置

6.2 代码展示

#include<deque>
#include<iostream>
#include<stdio.h>
using namespace std;

void printDeque(const deque<int> d) { //遍历打印输出
	for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++) {
		cout << (*it) << " ";
	}
	cout << endl;
}
//删除
void text06() {
	deque<int> d1;
	for (int i = 0; i < 10; i++) {
		d1.push_back(i);
	}
	printDeque(d1);

	//头尾删
	d1.pop_front();
	printDeque(d1);
	d1.pop_back();
	printDeque(d1);

	//迭代器删除指定位置  it+=pos
	deque<int>::iterator it = d1.begin();
	it++;
	d1.erase(it);
	printDeque(d1);

	//按照区间的方式删除
	d1.erase(it , d1.end()-2);
	printDeque(d1);

	//清空
	cout << "使用clear()清空为:";
	d1.clear();
	printDeque(d1);
	for (int i = 0; i < 10; i++) {
		d1.push_back(i);
	}
	printDeque(d1);
	d1.erase(d1.begin(), d1.end());
	cout << "使用erase()清空为:";
	printDeque(d1);
}

int main(){
	text06();
	return 0;
}

6.3 测试结果

在这里插入图片描述

7. 数据存取操作

7.1 函数原型

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

7.2 代码展示

#include<deque>
#include<iostream>
#include<stdio.h>
using namespace std;

void printDeque(const deque<int> d) { //遍历打印输出
	for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++) {
		cout << (*it) << " ";
	}
	cout << endl;
}
//数据存取
void text07() {
	deque<int>d1;
	for (int i = 0; i < 10; i++) {
		d1.push_back(i);
	}
	d1.push_back(20);
	d1.push_back(30);
	d1.push_front(100);
	d1.push_front(200);
	int len = d1.size();
	
	//通过[ ]访问
	for (int i = 0; i < len; i++) {
		cout << d1[i] << " ";
	}
	cout << endl;

	//通过at方式访问
	for (int i = 0; i < len; i++) {
		cout << d1.at(i) << " ";
	}
	cout << endl;

	//访问头尾元素
	cout << "头元素为:" << d1.front() << endl;
	cout << "尾元素为:" << d1.back() << endl;

}
int main(){
	text07();
	return 0;
}

7.3 测试结果

在这里插入图片描述

8. 排序操作

8.1 sort算法

  • sort(iterator beg, iterator end); 对beg和end区间元素进行排序
  • 包含头文件#include<algorithm>
  • 默认从小到大排【关于如何从大到小和如何自定义我们后面会讲到!!】
  • 对于支持随机访问的迭代器的容器,都可以利用sort算法直接进行排序

8.2 代码展示

#include<iostream>
#include<stdio.h>
#include<deque>
#include<algorithm>
using namespace std;

void printDeque(const deque<int> d) { //遍历打印输出
	for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++) {
		cout << (*it) << " ";
	}
	cout << endl;
}
void text08() {
	deque<int> d1;
	d1.push_back(100);
	d1.push_back(60);
	d1.push_back(90);
	d1.push_front(200);
	d1.push_front(10);
	d1.push_front(300);
	cout << "排序前:";
	printDeque(d1);

	//排序
	deque<int>::iterator it = d1.begin();
	int size = d1.size();
	sort(it, it + size);
	//或者sort(d1.begin(),d1.end());
	cout << "排序后:";
	printDeque(d1);
}
int main(){
	text08();
	return 0;
}

8.3 测试结果

在这里插入图片描述

9. 明日计划

  • 线代第一章提高题+三1
  • 蓝桥杯*5
  • STL stack+queue容器
  • 高代七1、2

10. 感谢大家支持!!!😉😉😉

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

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

相关文章

从零开始的数模(六)python在高等数学和线性代数中的应用

科学计算设计数值计算和符号计算&#xff0c;在python中作基础数值计算用numpy和scipy工具库&#xff0c;作符号运算用sympy工具库 sympy工具库–符号运算 符号运算基本知识 1.利用symbols函数创建符号变量构造多个符号变量时中间以空格分隔 2.利用符号变量创建表达式 3.利用…

Hive整合HBase,操作HBase表

Hive over HBase原理 Hive与HBase利用两者本身对外的API来实现整合&#xff0c;主要是靠HBaseStorageHandler进行通信&#xff0c;利用 HBaseStorageHandler&#xff0c;Hive可以获取到Hive表对应的HBase表名&#xff0c;列簇以及列&#xff0c;InputFormat和 OutputFormat类&…

STS:Surround-view Temporal Stereo for Multi-view 3D Detection——论文笔记

参考代码&#xff1a;None 1. 概述 介绍&#xff1a;这篇文章提出的方法是对LSS中深度估计部分进行改进&#xff0c;其改进的点是在深度估计部分引入立体匹配去估计周视相机下的深度信息&#xff0c;其中立体匹配使用前后视频帧进行构建&#xff08;可以看作是时序信息的使用&…

node-sass安装失败的解决方案

Nodejs 新版安装过程需要安装node-sass模块&#xff0c;开始一直无法安装成功&#xff0c;网上找了很多方法都无法解决&#xff0c;找了很久才找到的解决方案。 1.1 node-sass安装前准备 Option 2: Install dependencies and configuration manually Install Visual C Build E…

Python处理zip压缩文件

文章目录ZipFile对象写入压缩文件读取和解压缩常用属性ZipInfoZipFile对象 顾名思义&#xff0c;zipfile是处理zip文件的模块&#xff0c;其中最重要的类是ZipFile&#xff0c;其构造函数为 ZipFile(file, moder, compressionZIP_STORED, allowZip64True, compresslevelNone,…

使用VGG网络训练发生错误RuntimeError: CUDA out of memory解决方案:

问题在使用VGG网络训练Mnisist数据集时&#xff0c;发生错误RuntimeError: CUDA out of memory. Tried to allocate 392.00 MiB (GPU 0; 2.00 GiB total capacity; 1.45 GiB already allocated; 0 bytes free; 1.47 GiB reserved in total by PyTorch) If reserved memory is &…

发布详解 | Flutter 3.7 稳定版发布

新年伊始&#xff0c;由 Flutter 3.7 正式版来「打头阵」&#xff01;我们与整个 Flutter 社区成员们继续在 Flutter 3.7 中优化了框架&#xff0c;包括创建自定义菜单栏和层叠式菜单、更好的国际化工具支持、新的调试工具以及其他功能和特性等。新的稳定版里&#xff0c;我们在…

JUC面试(十二)——AQS

AQS juc.locks包下 AbstractQueuedSynchronizer&#xff0c;抽象的队列同步器 aqs是用来构建锁或者其它同步器组件的重量级基础框架及整个JUC体系的基石&#xff0c; 通过内置的FIFO队列来完成资源获取线程的排队工作&#xff0c;并通过一个int类变量表示持有锁的状态&#x…

极限运算法则——“高等数学”

各位CSDN的uu们你们好啊&#xff0c;今天&#xff0c;小雅兰学习的内容是极限运算法则 回顾 无穷小的极限运算法则 定理1&#xff1a;两个无穷小的和是无穷小 定理2&#xff1a;有界函数与无穷小的乘积是无穷小 极限的四则运算法则 定理3 定理4 定理5&#xff1a;极限的保序性…

实现自己的数据库二

一 前言上次数据库支持了一个测试表的插入和查询&#xff0c;但是数据全部保存到磁盘中的&#xff0c;如果程序重启后&#xff0c;数据都会全部丢了&#xff0c;所以需要持久化到磁盘上&#xff0c;像sqlite一样&#xff0c;简单的将数据库的数据保存到一个磁盘文件上。二 实现…

【BBuf的CUDA笔记】六,总结 FasterTransformer Encoder(BERT) 的cuda相关优化技巧

这里总结 FasterTransformer Encoder(BERT) 的cuda相关优化技巧 解读&#xff1a;https://github.com/NVIDIA/FasterTransformer/blob/main/docs/bert_guide.md &#xff0c;优化点解读之前是翻译了下 Faster Transformer BERT 的文档&#xff0c;然后省略了运行样例等环节&…

【Datewhale一起吃瓜 Task4】啃瓜第五章

支持向量机 任务&#xff1a;找到超平面 在样本空间中&#xff0c;找到最好的超平面把样本分开&#xff0c;即找到正中间的超平面 满足 该超平面 分开了两类该超平面 最大化支持向量间隔该超平面处于 间隔中间&#xff0c;到所有支持向量距离相等 如何找&#xff1a;表示出…

从聚水潭到金蝶云星空通过接口集成数据

从聚水潭到金蝶云星空通过接口集成数据数据源系统:聚水潭聚水潭成立于2014年&#xff0c;创始人兼CEO骆海东拥有近三十年传统及电商ERP的研发和实施部署经验。聚水潭创建之初&#xff0c;以电商SaaSERP切入市场&#xff0c;凭借出色的产品和服务&#xff0c;快速获得市场的肯定…

【论文简述】Attention-Aware Multi-View Stereo(CVPR 2020)

一、论文简述 1. 第一作者&#xff1a;Keyang Luo 2. 发表年份&#xff1a;2020 3. 发表期刊&#xff1a;CVPR 4. 关键词&#xff1a;MVS、代价体、注意力机制、正则化 5. 探索动机&#xff1a; However, the feature matching results from different channels are usual…

仿写Dubbo-MyRpc

基础 在仿写Dubbo之前&#xff0c;需要了解一些技术&#xff0c;像Java反射&#xff0c;Java代理&#xff0c;Java Socket以及Dubbo相关概念。 项目结构 项目gitee地址&#xff1a;https://gitee.com/AGi_R/framework my-common 整个项目的公共资源库。存放一些公共的注解&…

拦截器、过滤器、监听器

目录一、拦截器1. 拦截器是什么?2. 设置拦截器a. 定义拦截器b. 配置加载拦截器c. 新建页面二、过滤器1. 使用原因2. Filter概念图3. Filter编程三、监听器一、拦截器 拦截器&#xff1a;必须保证页面有访问controller的操作&#xff0c;否则拦截不了 1. 拦截器是什么? 概念…

OpenWrt软路由空间扩容

文章目录预备知识OpenWrt系统固件分类EXT4固件扩容方式新建分区扩容操作步骤直接扩容操作步骤SQUASHFS固件扩容方式新建分区扩容直接扩容EFI引导固件的额外操作参考预备知识 OpenWrt系统固件分类 EXT4固件 固件包名称中包含有ext4关键字&#xff0c;可以参考固件分类关键字示意…

设计模式 - 创建型模式_建造者模式

文章目录创建型模式概述Case模拟工程Bad ImplBetter Impl &#xff08;建造者模式重构代码&#xff09;小结创建型模式 创建型模式提供创建对象的机制&#xff0c; 能够提升已有代码的灵活性和可复⽤性。 类型实现要点工厂方法定义⼀个创建对象的接⼝&#xff0c;让其⼦类⾃⼰…

编写用户注册用表单

<!-- 需求&#xff1a; 用户注册&#xff1a;用户名、密码、确认密码、性别、兴趣爱好、学历、简介 --> <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>编写用户注册用表单<…

【Linux】Linux和Window下\r与\n的区别、git命令行的使用

作者&#xff1a;小卢 专栏&#xff1a;《Linux》、《Git》 喜欢的话&#xff1a;世间因为少年的挺身而出&#xff0c;而更加瑰丽。 ——《人民日报》 目录 1. 回车换行符在Window下和在Linux下的区别&#xff1a; 1.1回车换行符&#xff1a;…