【STL】C++标准模板库——deque(队列)

01、目录

02、deque简介与使用

2.1、 简介

C++队列(deque)是一种容器适配器,它给予程序员一种先进先出(FIFO)的数据结构。

  1. deque(发音类似“deck”),是双端队列不规则的首字母缩写,双端队列是动态大小的序列式容器,其可 以像两端进行伸缩。
  2. 特定的库可以以不同的方式实现deque,但通常都是一种动态数组。不论在何种情况下,它都允许通过 随机访问迭代器直接访问单个元素,可以根据需要动态的伸缩。
  3. deque提供了一些与vector相似的功能,但deque在头部和尾部进行数据插入和删除操作更加高 效。与vector不同的是,deque不能保证所有的元素存储在连续的空间中,在deque中通过指针加偏移 量方式访问元素可能会导致非法的操作。
  4. vector与list提供了相似的接口,因此其具有类似的用途,但是内部的实现原理不同:vector使用使用了 动态数组,该数组通常需要动态增长;deque中的元素可能分散在不同的存储块中,在deque中保存了 一些必要的信息,通常用来在常数范围内直接访问deque中的任何一个元素,所以deque的内部实现比 vector复杂,但是这些额外信息使得dque在某些情况下增长更加的高效,特别是在序列比较大,重新分 配成本比较高的情况下。
  5. 除了在频繁在头部或尾部进行插入和删除操作外,deque比list和forward_list的性能更差。

在这里插入图片描述

2.2、 使用
  1. deque的构造
    在这里插入图片描述

  2. deque的迭代器
    双端队列底层是一段假象的连续空间,实际是分段连续的,为了维护器“整体连续”的假象,被deque的迭代器实现了,原理图如下:
    在这里插入图片描述
    在这里插入图片描述

  3. deque的容量操作
    在这里插入图片描述

  4. deque的元素访问操作
    在这里插入图片描述

  5. deque中修改操作
    在这里插入图片描述

03、deque成员函数表及示例

这里的话,我主要讲几个常用的成员函数,因为这个deque容器本来就用的少,函数的话,讲一下常用的即可。

函数(Function)描述(Description)
push_back()在deque容器尾部插入一个元素(尾插)
push_front()在deque容器头部插入一个元素(头插)
pop_back()在deque容器尾部删除一个元素(尾删)
pop_front()在deque容器头部删除一个元素(头删)
front()返回第一个元素
back()返回最后一个元素
size()返回deque容器中元素的总个数
empty()返回值为bool类型,容器为NULL则为true
3.1、 push_back() 和 push_front()

Syntax:

//void push_back( const TYPE &val );
//void push_front( const TYPE &val );

#include <iostream>
#include <deque>
using namespace std;

void test01()
{
	deque<int> de;
	de.push_front(1);

	//下面我们就可以对比着写了
	de.push_back(4); //在1的后面插入4
	de.push_front(3); //在1的前面插入3

	for(int i : de)
	{
		cout << i << " ";
	}
	cout << endl;
}

int main()
{
	test01(); //打印3 1 4
	
	system("pause");
	return 0;
}

3.2、 pop_back() 和 pop_front()

Syntax:

//void pop_back();
//void pop_front();

#include <iostream>
#include <deque>
using namespace std;

void test01()
{
	deque<int> de;
	de.push_front(1);

	//下面我们就可以对比着写了
	de.push_back(4); //在1的后面插入4
	de.push_front(3); //在1的前面插入3

	for(int i : de)
	{
		cout << i << " ";
	}
	cout << endl;

	//下面就我们就在上面的基础上做删除操作,且删除一次,看一次。
	de.pop_back(); //尾删
	for(int i : de)
	{
		cout << "pop_back后:" << i << endl; // 3 1
	}
	
	de.pop_front(); //头删
	for(int i : de)
	{
		cout << "pop_front后:" << i << endl; // 1
	}
}

int main()
{
	test01();
	
	system("pause");
	return 0;
}

3.3、 front() 和 back()

Syntax:

// TYPE &front(); 返回队列第一个元素的引用。
// TYPE &back();  返回一个引用,指向队列的最后一个元素。
#include <iostream>
#include <deque>
using namespace std;

void test01()
{
	deque<int> de;
	de.push_front(1);

	//下面我们就可以对比着写了
	de.push_back(4); //在1的后面插入4
	de.push_front(3); //在1的前面插入3

	for(int i : de)
	{
		cout << i << " ";
	}
	cout << endl;

	//下面就我们就在上面的基础上做查值操作
	cout << "第一个元素是:" << de.front() << endl; //3
	cout << "最后一个元素是:" << de.back() << endl; //4
}

int main()
{
	test01();
	
	system("pause");
	return 0;
}

3.4、 size()

Syntax:

#include <iostream>
#include <deque>
using namespace std;

void test01()
{
	deque<int> de;
	de.push_front(1);
	de.push_front(10);
	de.push_front(11);

	//下面我们就可以对比着写了
	de.push_back(4); //在1的后面插入4
	de.push_front(3); //在1的前面插入3

	for(int i : de)
	{
		cout << i << " ";
	}
	cout << endl;

	//下面就我们就在上面的基础上操作
	int len = de.size();
	cout << "deque的大小是:" << len << endl; //5
}

int main()
{
	test01();
	
	system("pause");
	return 0;
}
3.5、 empty()

Syntax:

#include <iostream>
#include <deque>
using namespace std;

void test01()
{
	deque<int> de;
	de.push_front(1);
	de.push_front(10);
	de.push_front(11);

	//下面我们就可以对比着写了
	de.push_back(4); //在1的后面插入4
	de.push_front(3); //在1的前面插入3

	for(int i : de)
	{
		cout << i << " ";
	}
	cout << endl;

	//下面就我们就在上面的基础上操作
	if(de.empty()) {
		cout << "de为NULL" << endl;
	}
	else{
		cout << "de不为NULL" << endl; //运行此句
	}
}

int main()
{
	test01();
	
	system("pause");
	return 0;
}

04、小结

只是简单的存储元素使用vector即可,如果对元素任意位置进行插入或者删除操作比较多,使用list即可,所以一般很少使用deque;deque的最大应用,就是用其作为标准库中stack和queue的底层结构。

关于deque的话,大概就只有这几个会用上,其他的迭代器等等,上面图片中已经有大致说明,了解即可,将重点放在vector、list、map、set等容器上即可。

版权声明:转载请注明出处,谢谢!

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cain Xcy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值