C++STL——deque容器详解

这篇具有很好参考价值的文章主要介绍了C++STL——deque容器详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

C++STL——deque容器详解,C++核心编程,c++,开发语言,学习,笔记
纵有疾风起,人生不言弃。本文篇幅较长,如有错误请不吝赐教,感谢支持。

一.deque容器的基本概念

vector容器是单向开口的连续内存空间,deque(['dek])则是一种双向开口的连续线性空间。所谓的双向开口,意思是可以在头尾两端分别做元素的插入和删除操作,可以理解为数据结构的双端队列。当然,vector容器也可以在头尾两端插入元素,但是在其头部操作效率奇差,全部元素都要后移,无法被接受。
C++STL——deque容器详解,C++核心编程,c++,开发语言,学习,笔记
✅deque容器和vector容器的差异:

  • ①deque是双端队列,可在容器的头部和尾部插入或删除元素。
  • ②deque没有容量的概念,因为它是动态的以分段连续空间组合而成,随时可以增加一段新的空间并链接起来,换句话说,deque不会像vector那样,”旧空间不足而重新配置一块更大空间,然后复制元素,再释放旧空间”这样的事情在deque身上是不会发生的。deque可以随时将空间串接在首部或尾部,也因此,deque没有必须要提供所谓的空间保留(reserve)功能。

✅deque容器内部实现原理:

deque容器在逻辑上是一片连续的空间,但这只是一种假象,实际deque是由一段一段的定量的连续空间构成。一旦有必要在deque前端或者尾端增加新的空间,便配置一段连续定量的空间,串接在deque的头端或者尾端。deque最大的工作就是维护这些分段连续的内存空间的整体性的假象,并提供随机存取的接口,避开了(1)重新配置空间申请更大空间 (2)原数据复制新空间 (3)释放原空间三步骤,代价就是复杂的迭代器架构。

既然deque是分段连续内存空间,那么就必须有中央控制,维持整体连续的假象。deque内部存在中央控制器,记录与维护每段数据缓冲区(存储数据的空间)的内存地址,缓冲区中存储真实数据,保证可从容器的头部与尾部插入或删除元素。缓冲区才是deque的存储空间主体。
C++STL——deque容器详解,C++核心编程,c++,开发语言,学习,笔记
deque容器的迭代器:
支持随机访问的迭代器,可跳跃式访问容器元素。

二.deque容器常用操作

①deque构造函数

作用:创建deque容器。
注:使用deque容器时,需包含头文件#include <deque>

函数原型 解释
deque<T> deq T; 默认构造形式(显示实例化)
deque(beg, end); 构造函数将[beg, end)区间中的元素拷贝给本身。
deque(n, elem); 有参构造函数,使用n个elem元素进行初始化。
deque(const deque &deq); 拷贝构造函数,使用已有deque对象初始化新的对象。

实例:deque构造函数

#include <iostream>
using namespace std;
#include <deque>//包含头文件
void printdeque(const deque<int>& deq)//形参使用const,避免被修改
{	//const_iterator只读迭代器
	for (deque<int>::const_iterator it = deq.begin(); it != deq.end(); ++it)
	{
		cout << *it<<"|";
	}
	cout << endl;
}
void test()
{
	deque<int> v1 = { 1,2,3 };//采用模板实现类实现(显示实例化),默认构造函数,
	deque<int> v2(6, 1);//构造函数将n个elem拷贝给本身。
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	deque<int> v3(arr, arr + sizeof(arr) / sizeof(arr[0]));//将v[begin(), end())区间中的元素拷贝给本身
	deque<int> v4(v1);//拷贝构造函数,拿另一个vector对象初始化本身
	printdeque(v1);
	printdeque(v2);
	printdeque(v3);
	printdeque(v4);
}
int main()
{
	test();
	return 0;
}

C++STL——deque容器详解,C++核心编程,c++,开发语言,学习,笔记

②deque元素操作

作用:通过重载赋值运算符operator[]和成员函数at(int index),对deque容器的单个元素进行读(作为右值)或写(作为左值)。

函数原型 解释
T &operator[](size_t n); 通过[]访问元素,如果越界,不抛异常,程序直接挂掉
T &at(size_t n); 通过at方法获取下标为n的元素,如果n越界,抛出out_of_range异常
T *data(); 返回容器中动态数组的首地址。
const T *data() const; 返回容器中动态数组的首地址。
T &front(); 返回第一个元素。
T &back(); 返回,最后一个元素。

③deque赋值操作

作用:通过重载赋值运算符operator=和成员函数assign(),对deque容器进行赋值。

函数原型 解释
assign(beg, end); 拷贝目标deque容器中[begin(), end())区间的元素,对当前deque容器赋值。
assign(n, elem); 将n个elem拷贝赋值给本身。
deque&operator=(const deque &deq); 重载等号操作符
swap(deq); 将deq与本身的元素互换

实例:deque赋值操作

#include <iostream>
using namespace std;
#include <deque>//包含头文件
void printdeque(const deque<int>& deq)//形参使用const,避免被修改
{	//const_iterator只读迭代器
	for (deque<int>::const_iterator it = deq.begin(); it != deq.end(); ++it)
	{
		cout << *it<<"|";
	}
	cout << endl;
}
void test()
{
	deque<int> deq;

	//尾插法插入元素
	for (int i = 0; i < 5; i++) {


		deq.push_back(i);
	}
	//遍历
	printdeque(deq);	//0 1 2 3 4

	/* 1.重载运算符=赋值 */
	deque<int> d1;
	d1 = deq;
	printdeque(d1);	//0 1 2 3 4

	/* 2.assign()函数,区间拷贝 */
	deque<int> d2;
	d2.assign(deq.begin(), deq.end());
	printdeque(d2);	//0 1 2 3 4

	/* 3.assign()函数,n个elem元素赋值 */
	deque<int> d3;
	//5个整型元素6
	d3.assign(5, 6);
	printdeque(d3);	//6 6 6 6 6
}
int main()
{
	test();
	return 0;
}

C++STL——deque容器详解,C++核心编程,c++,开发语言,学习,笔记

④deque交换操作

💬表格一览:

函数原型 解释
void swap(deque &deq); 把当前容器与deq交换。

实例:deque交换操作

#include <iostream>
using namespace std;
#include <deque>//包含头文件
void printdeque(const deque<int>& deq)//形参使用const,避免被修改
{	//const_iterator只读迭代器
	for (deque<int>::const_iterator it = deq.begin(); it != deq.end(); ++it)
	{
		cout << *it<<"|";
	}
	cout << endl;
}
void test()
{
	deque<int> deq;

	//尾插法插入元素
	for (int i = 0; i < 5; i++) {


		deq.push_back(i);
	}
	//遍历
	printdeque(deq);	//0 1 2 3 4
	deque<int> d1;
	d1.swap(deq);//将deq与本身的元素互换
	printdeque(d1);
}
int main()
{
	test();
	return 0;
}

C++STL——deque容器详解,C++核心编程,c++,开发语言,学习,笔记

⑤deque大小操作

作用:操作deque容器的大小(即元素个数)。

函数原型 解释
bool empty() const; 判断容器是否为空。
size_t size() const; 返回容器的实际大小(已使用的空间)。
resize(int num); 重新指定容器的长度为num。若容器变长,则以默认值0填充新位置;若容器变短,则容器末尾超出新长度的元素被删除。
resize(int num, elem); 重新指定容器的长度为num。若容器变长,则以指定值elem填充新位置;若容器变短,则容器末尾超出新长度的元素被删除。

实例:deque大小操作

#include <iostream>
using namespace std;
#include <deque>//包含头文件
void printdeque(const deque<int>& deq)//形参使用const,避免被修改
{	//const_iterator只读迭代器
	for (deque<int>::const_iterator it = deq.begin(); it != deq.end(); ++it)
	{
		cout << *it<<"|";
	}
	cout << endl;
}
void test()
{
	deque<int> deq;
	//尾插法插入元素
	for (int i = 0; i < 5; i++) {


		deq.push_back(i);
	}
	printdeque(deq);	//0 1 2 3 4

	//empty():判断容器是否为空
	cout << (deq.empty() ? "deq为空" : "deq不为空") << endl;	//deq不为空

	//size(); :获取容器的大小,即元素个数。
	cout << "deq的大小/元素个数:" << deq.size() << endl;	//5

	//resize(int num);:重新指定容器的长度为num
	//若容器变长,则以默认值0填充新位置;若容器变短,则容器末尾超出新长度的元素被删除。
	deq.resize(10);			//长度变大时,使用默认值0填充
	printdeque(deq);	//0 1 2 3 4 0 0 0 0 0

	deq.resize(3);			//长度变小时,容器末尾超出新长度的元素被删除
	printdeque(deq);	//0 1 2

	//resize(int num, elem); :重新指定容器的长度为num。
	//若容器变长,则以指定值elem填充新位置;若容器变短,则容器末尾超出新长度的元素被删除。
	deq.resize(8, 6);		//长度变大时,使用指定值6填充
	printdeque(deq);	//0 1 2 6 6 6 6 6

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

C++STL——deque容器详解,C++核心编程,c++,开发语言,学习,笔记

注:deque容器不存在容量的概念,即不存在capacity()成员函数。可随时开辟缓冲区存储数据。

⑥deque插入和删除

💬表格一览:

函数原型 解释
iterator insert(iterator pos, const T& ele); 在指定位置插入一个元素ele 返回指向插入元素的迭代器。
iterator insert(const_iterator pos, int count,ele); 迭代器指向位置pos插入count个元素ele.返回指向插入元素的迭代器。
void push_front(const T& ele); 在容器头部插入一个数据
void push_back(const T& ele); 尾部插入元素ele
void pop_front(); 删除容器第一个数据
void pop_back(); 删除最后一个元素
void clear(); 清空容器。
iterator erase(const_iterator start, const_iterator end); 删除迭代器从start到end之间的元素,返回下一个有效的迭代器。
iterator erase(const_iterator pos); 删除迭代器指向的元素,返回下一个有效的迭代器。

实例:deque插入和删除

#include <iostream>
using namespace std;
#include <deque>//包含头文件
void printdeque(const deque<int>& deq)//形参使用const,避免被修改
{	//const_iterator只读迭代器
	for (deque<int>::const_iterator it = deq.begin(); it != deq.end(); ++it)
	{
		cout << *it<<"|";
	}
	cout << endl;
}
void test()
{
	deque<int> v;
	for (int i = 0; i < 5; i++)
	{
		v.push_back(i + 1);//尾部插入元素
	}

	printdeque(v);//1 2 3 4 5

	v.insert(v.begin() + 1, 2, 100);//在第二个元素插入2个100
	printdeque(v);//1 100 100 2 3 4 5

	v.pop_front();//头部删除一个元素
	v.pop_back();//尾部删除一个元素
	printdeque(v);//100 100 2 3 4
	cout << "-------------" << endl;
	v.erase(v.begin());//删除第一个元素
	printdeque(v);//100 2 3 4

	deque<int>::const_iterator it = v.erase(v.begin() + 1, v.end() - 1);//删除从第二个元素到倒数第二个元素,返回下一个有效迭代器
	printdeque(v);//100 4

	v.insert(it, 66);
	printdeque(v);//100 66 4

	v.clear();//清空容器
}
int main()
{
	test();
	return 0;
}

C++STL——deque容器详解,C++核心编程,c++,开发语言,学习,笔记文章来源地址https://www.toymoban.com/news/detail-653437.html

到了这里,关于C++STL——deque容器详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++】STL之容器适配器——使用deque适配stack和queue

    个人主页:🍝在肯德基吃麻辣烫 分享一句喜欢的话:热烈的火焰,冰封在最沉默的火山深处。 本文章主要介绍容器适配器的功能,以及一个适配的场景。 容器适配器,按字面意思理解的话,就是用来对一个容器进行匹配的。在C++STL中,容器有:vector,list,deque,map,set等。

    2024年02月16日
    浏览(56)
  • 容器适配器---deque和STL ---stack queue priority_queue的模拟实现 C++

    目录 一、容器适配器 deque原理 deque的缺陷 deque的优势 二、stack的模拟实现  三、queue的模拟实现 四、优先级队列的模拟实现 适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),该种模式是将一个类的接口转换成客户

    2024年02月02日
    浏览(55)
  • C++ STL之 queue和deque用法详解

    1.1 创建queue对象: queue数据类型,容器类型 q; 数据类型:可以是int、double等基本类型,也可以是自定义的结构体。 容器类型:一般为deque或者list(双向链表),可省略,省略时以deque为默认容器。 声明代码如下: 只能队尾插入,队首弹出。无法index遍历,也不可以迭代器遍

    2023年04月10日
    浏览(35)
  • [C++] STL_priority_queue(优先级队列) 的使用及底层的模拟实现,容器适配器,deque的原理介绍

    priority_queue文档介绍 翻译: 1. 优先队列是一种 容器适配器 ,根据严格的弱排序标准, 它的第一个元素总是它所包含的元素中最大的。 2. 此上下文类似于 堆 , 在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部的元素)。 3. 优先队列被实现为容器适配

    2024年02月04日
    浏览(47)
  • 从零开始学习JavaScript:轻松掌握编程语言的核心技能⑤

    🏘️🏘️个人简介:以山河作礼。 🎖️🎖️: Python领域新星创作者,CSDN实力新星认证,阿里云社区专家博主 🎁🎁:Web全栈开发专栏:《Web全栈开发》免费专栏,欢迎阅读! 📑📑 在 JavaScript 中,函数可以通过 function 来定义 。 📌 函数定义的一般语法如下: 其中,

    2024年02月08日
    浏览(71)
  • 从零开始学习JavaScript:轻松掌握编程语言的核心技能①

    🏘️🏘️个人简介:以山河作礼。 🎖️🎖️: Python领域新星创作者,CSDN实力新星认证,阿里云社区专家博主 🎁🎁:Web全栈开发专栏:《Web全栈开发》免费专栏,欢迎阅读! 📜📜 JavaScript 是一种脚本语言,用于在 Web 页面上执行交互式操作和动态效果 。它最初由 Brendan

    2024年02月07日
    浏览(71)
  • 从零开始学习JavaScript:轻松掌握编程语言的核心技能③

    🏘️🏘️个人简介:以山河作礼。 🎖️🎖️: Python领域新星创作者,CSDN实力新星认证,阿里云社区专家博主 🎁🎁:Web全栈开发专栏:《Web全栈开发》免费专栏,欢迎阅读! 📑📑 JavaScript中的if…else语句是一种条件语句,用于在满足特定条件时执行不同的代码块 。 📌

    2024年02月08日
    浏览(71)
  • 从零开始学习JavaScript:轻松掌握编程语言的核心技能④

    🏘️🏘️个人简介:以山河作礼。 🎖️🎖️: Python领域新星创作者,CSDN实力新星认证,阿里云社区专家博主 🎁🎁:Web全栈开发专栏:《Web全栈开发》免费专栏,欢迎阅读! 📌 JavaScript 可用来在数据被送往服务器前对 HTML 表单中的这些输入数据进行验证。 表单数据经常需

    2024年02月08日
    浏览(58)
  • 从零开始学习JavaScript:轻松掌握编程语言的核心技能②

    🏘️🏘️个人简介:以山河作礼。 🎖️🎖️: Python领域新星创作者,CSDN实力新星认证,阿里云社区专家博主 🎁🎁:Web全栈开发专栏:《Web全栈开发》免费专栏,欢迎阅读! 📜 📜 JavaScript 函数是一段可以被重复调用的代码块。它可以接收输入参数,处理这些参数,然后返

    2024年02月08日
    浏览(71)
  • C++提高编程——STL:string容器、vector容器

    本专栏记录C++学习过程包括C++基础以及数据结构和算法,其中第一部分计划时间一个月,主要跟着黑马视频教程,学习路线如下, 不定时更新,欢迎关注 。 当前章节处于: ---------第1阶段-C++基础入门 ---------第2阶段实战-通讯录管理系统, ---------第3阶段-C++核心编程, -----

    2024年01月23日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包