C++STL标准模板库之容器deque

本文介绍了C++ STL中的deque容器,作为双端队列,deque允许在两端进行插入和删除操作。文章详细讲解了deque的实现原理,以及如何创建、赋值、查询、调整容器长度以及增删改查数据。同时,对比了deque与vector的区别,强调deque没有capacity()函数。最后,作者承诺将继续分享更多关于STL的内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

网上总结deque原理和用法的文章有很多,我也是在学习中逐渐摸索总结,希望能够和大家共同进步。

DEQUE简介

deque是doble-ended queue的缩写,是STL标准模板库中的重要容器之一,可以通过设置来存放各种不同类型的数据。和vector容器不同的是,vector容器可以调用函数从容器末端插入或删除元素,而deque容器可以通过调用函数在容器的两端插入或删除元素。

DEQUE实现

在工程中创建一个deque对象,在deque上右键转到定义,可以找到deque对应的实现代码。

template<class _Ty,
	class _Alloc = allocator<_Ty> >
	class deque
		: public _Deque_alloc<_Deque_base_types<_Ty, _Alloc> >
	{	// circular queue of pointers to blocks
public:
	typedef deque<_Ty, _Alloc> _Myt;
	...
	}

由于代码非常多,所以在这里只贴一小部分,能够看出,deque实际上是一个模板类,它通过类模板的形式来达到存储不同种数据的实现。也可以将其看做是存放某种数据类型的双端动态数组

DEQUE使用方法

1.建立容器(构造对象)
//---无初值---
deque<int> d1; 			//表示存放int型的容器
deque<double> d1; 		//表示存放double型的容器

class color{...};
deque<color> dc1;		//表示存放类color的容器

//---有初值---
deque<int> d1 = { 1, 2, 3, 4 };			//d1的元素是1、2、3、4
deque<int> d2(5);						//d2的元素个数为5,元素值都为0
deque<int> d3(5, 1);					//d3的元素个数为5,元素值都为1
deque<int> d4(d1);						//拷贝构造,d4=d1
deque<int> d5(d1.begin(), d1.end()); 	//d5的元素是从d1的首个元素到最后一个元素
deque<int> d6(d1.begin(), d1.begin()+3);//d6的元素是d1的前3个元素

int ary[] = {1,2,3,4,5};
deque<int> d7(ary, ary+3);				//d7的元素是数组ary中的前3个元素

这里和vector用法一致,带有(iter* _First, iter* _End)的均为左闭右开

2.容器赋值
//---assign函数---
deque<int> d1 = {1,2,3,4,5,6};
deque<int> d2;
d2.assign({1,2,3,4,5});				//d2被赋值为{1,2,3,4,5}
d2.assign(d1.begin(), d1.end()); 	//d2被赋值为d1的首个元素到最后一个元素
d2.assign(d1.begin(), d1.begin()+3); //d2被赋值为d1的首个元素到第3个元素

deque<int>::iterator iter = d1.begin();
d2.assign(iter, iter+3);			//利用迭代器,d2被赋值为d1的首个元素到第3个元素

//---直接赋值---
d2 = d1;							//爽!
3.容器长度的查询、设置和调整
//---查询长度---
deque<int> d1 = {1,2,3,4,5};
int len = d1.size();		//得到d1的长度,即元素个数
bool isEmpty = d1.empty();	//查询容器是否为空,是则返回true

注意:和vector不同,deque没有capacity()函数!

//---调整长度---
deque<int> d1 = {1,2,3,4,5};
d1.resize(8);		//d1的元素个数改为8个,大于原长度则补默认值0
d1.resize(3);		//d1的元素个数改为3个,小于原长度则删除后面2个
d1.resize(8, 88);	//d1的元素个数改为8,大于原长度则补设定值88
d1.resize(3, 88);	//d1的元素个数改为3,小于原长度则删除后面2个

deque容器调整长度和vector用法一致。

4.容器数据的增加、删除、查询和改动

1.数据添加

//---在末尾添加元素---
deque<int> d1 = {1,2,3,4,5};
d1.push_back(6);								//在末尾添加元素,值为6

//---在首部添加元素---
d1.push_front(0);								//在首部添加元素,值为0


//---在数据中间插入元素---
deque<int> d2 = {6,7,8,9,10};
d1.insert(d1.begin() + 1, d2.begin(), d2.end());//在d1的第1个元素的前面插入d2
d1.insert(d1.begin() + 1, 5, 66);				//在d1的第1个元素的前面插入5个66
d1.insert(d1.begin() + 1, 66);					//在d1的第1个元素的前面插入66
d1.insert(d1.begin() + 1, { 6,7,8 });			//在d1的第1个元素的前面插入{6,7,8}

2.数据删除

//---删除末尾元素---
deque<int> d1 = {1,2,3,4,5};
d1.pop_back();							//删除末尾元素5
d1.pop_front();							//删除首部元素1

//---删除中间元素---
d1.erase(d1.begin()+1);					//删除第2个元素d1[1]
d1.erase(d1.begin()+1, d1.begin()+3);	//删除从第2个到第3个元素,即从d1[1]至d1[2]。注意左开右闭!

//---删除所有元素---
d1.clear();								//爽!

3.数据的单独查询和改动

//---查找容器内是否包含某一元素---
deque<int> d1 = {1,2,3,4,5};
bool isFind = count(d1.begin(), d1.end(), 3);//在d1内查找3是否存在,是则返回1

//---下标操作---
int num1 = d1[3];
d1[3] = 6;

//---at函数---
int num2 = d1.at(3);
d1.at(3) = 6;

//---首位接口---
int num3 = d1.front();	//d1的首元素
int num4 = d1.back();	//d1的末元素
d1.front() = 6;			//d1的首元素更改为6
d1.back() = 6;			//d1的末元素更改为6

4.数据的依次查询或改动

//---通过循环---
deque<int> d1 = {1,2,3,4,5};
for(int i = 0; i < d1.size(); i++) {
	cout << "第" << i << "个元素的值为:" << d1[i] << endl; 	//读取
	d1[i] = 5;												//赋值
}

//---通过迭代器---
queue<int>::iterator iter = d1.begin();
for(; iter != d1.end(); iter++) {
	cout << *iter << endl;									//读取
	*iter = 5;												//赋值
}

5.容器的其它操作

//需要头文件#include<algorithm>
//---排序---
deque<int> d1 = {2,1,3,4,5};
sort(d1.begin(), d1.end());//对容器d1内的数据进行排序,区间可选

//---反转---
reverse(d1.begin(), d1.end());//对容器d1进行反转,区间可选

//后面如果遇到再补充吧

关于STL的其它部分也会在以后的学习过程中继续更新,希望大家批评指正!
链接: C++STL标准模板库之容器vector.

我是没信号的法杖,无法发送信号,也无法接受信号。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值