C C++最全<C++>快速掌握双端数组容器deque的使用_c++双端数组(2),高级C C++开发技术

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

✅作者简介:C/C++领域新星创作者,为C++和java奋斗中
✨个人主页:微凉秋意的主页
🔥系列专栏:C++STL快速上手
📃推荐一款模拟面试、刷题神器👉注册免费刷题

🔥前言

书接上文,今天分享的是和vector容器功能很像的容器——deque,了解deque容器的本质,使用方法以及与vector容器的不同之处,再后面的文章里会有vector和deque容器结合的具体案例分享给大家。

文章目录

deque容器的概念模型

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

  • 示意图
    在这里插入图片描述

值得注意的是deque容器比vector容器多了头插、头删的操作以及front()back(),后面这两个分别代表容器的第一个元素和最后一个元素,并不是迭代器,调用他们会得到具体的值。

deque与vector的区别:

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

deque的内部工作原理:

  • deque内部有个中控器,维护每段缓冲区中的内容,缓冲区中存放真实数据。
  • 中控器维护的是每个缓冲区的地址,使得使用deque时像一片连续的内存空间
  • deque的迭代器也是支持随机访问的
  • 图示:
    在这里插入图片描述

deque进行插入的时候是在结点对应的缓冲区操作的,缓冲区不有位置的时候直接插入到缓冲区中,缓冲区满的话就开辟新节点,再进行插入,所以才说像是连续的存储空间。

deque容器的基本操作

包括构造方法、赋值、计算大小、插入删除等

构造函数

  • deque容器的构造

函数原型

  • deque<T> deq;其中T是泛型,用来存放数据类型,这是默认构造函数,较为常用
  • deque(deq.begin(),deq.end()); 将[deq.begin(),deq.end)前闭后开的区间内的元素拷贝给本身容器
  • deque(n,elem);构造函数将n个elem值拷贝给本身容器
  • deque(const deque &ans);拷贝构造函数

代码示例:

//打印
void printDeque(const deque<int>& d)//只读容器不可改
{//迭代器变为 const\_iterator
	for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++)
	{
		cout << \*it << " ";
	}
	cout << endl;
}
void testa()
{
	//构造:
	//第一种
	deque<int>d1;
	for (int i = 0; i < 10; i++)
	{
		//d1.push\_back(i); 头插尾插都可以
		d1.push\_front(i);
	}
	//第二种
	deque<int>d2(d1.begin(), d1.end());
	//第三种
	deque<int>d3(d2);
	//第四种
	deque<int>d4(6, 100);
	//测试输出
	printDeque(d1);
	printDeque(d2);
	printDeque(d3);
	printDeque(d4);
	//排序
	cout << "排序" << endl;
	sort(d1.begin(), d1.end());
	printDeque(d1);
}

tips:如果将打印语句设为只读,那么迭代器类型也要变为:const_iterator

赋值操作

  • 给deque容器赋值

函数原型:

  • deque& operator=(const deque &ans);重载赋值操作符
  • assign(be,en);将[be,en);将[be,en)区间内的数组拷贝赋值给自己
  • assign(n,elem);将n个elem拷贝赋值给自己

代码示例:

void testb()
{
	//赋值:
	deque<int>d1;
	for (int i = 0; i < 10; i++)
	{
		d1.push\_back(i);
	}
	//第一种
	deque<int>d2 = d1;
	//第二种
	deque<int>d3;
	d3.assign(d1.begin(), d1.end());
	//第三种
	deque<int>d4;
	d4.assign(6, 88);
	//测试:
	printDeque(d2);
	printDeque(d3);
	printDeque(d4);
}

容器大小

  • 对deque的大小进行操作
  • deque.empty();判断容器是否为空
  • deque.size();返回容器中元素的个数
  • deque.resize(m);重新指定容器长度为num,容器变长以默认值填充,容器变短则超出部分删除
  • deque.resize(m,elem);同上,区别是默认值填充变为elem值填充

代码示例:

void testc()
{
	//大小的操作:
	//size:
	deque<int>d;
	if (d.empty())
	{
		cout << "此时容器为空" << endl;
		cout << "打印容器的大小:" << d.size() << endl;
	}
	for (int i = 0; i < 7; i++)
	{
		d.push\_back(i);
	}
	cout << "打印容器的大小:" << d.size() << endl;
	printDeque(d);

	//resize
	d.resize(10,100);
	cout << "打印容器的大小:" << d.size() << endl;
	printDeque(d);
	d.resize(5);
	cout << "打印容器的大小:" << d.size() << endl;
	printDeque(d);
}

tips:

  • deque没有容量概念
  • 判断是否为空——empty
  • 返回元素个数——size
  • 重新指定个数——resize

插入和删除

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

15710920339)]
[外链图片转存中…(img-Fw2dbR6w-1715710920339)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值