deque的介绍及使用(deque的构造, 拷贝构造, 迭代器, 基本操作,增删改查, deque的应用场景)

deque的介绍及使用

1、deque是双端队列,双端队列是动态大小的序列式容器
2、deque是动态数组,允许通过随机访问迭代器直接访问单个元素
3、deque不能保证元素都存储在连续的空间,deque加指针偏移会导致非法
4、deque分布在不同的存储块中
5、deque在头尾进行操作时的效率最高,其他性能较差

1、deque的构造

函数声明 接口说明
deque() 构造空的双端队列
deque(n, val = value_type()) 用n个值为val的元素构造双端队列
deque(InputIterator first, InputIterator last) 用[first, last)的区间构造双端队列
deque(const deque& x) 双端队列的拷贝构造函数
#include <iostream>
#include <deque>
using namespace std;

int main()
{

	deque<int> d1;//构造空d1
	deque<int> d2(10, 5);//构造10个值为5的d2
	
	for (auto& e : d2)
	{
		cout << e << " ";
	}
	cout << endl;

	int arr[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };//用数组区间构造d3
	deque<int> d3(arr, arr + sizeof(arr) / sizeof(arr[0]));

	for (auto& e : d3)
	{
		cout << e << " ";
	}
	cout << endl;

	deque<int> d4(d3);//拷贝构造d4

	for (auto& e : d4)
	{
		cout << e << " ";
	}
	cout << endl;

	system("pause");
	return 0;
}

2、deque的迭代器

函数声明 接口说明
[begin(), end()()) begin:容器起始位置 end最后一个元素下一个位置
[rbegin(), rend()) 反向迭代器rbegin在end位置,rend在begin
[cbegin(), cend()) const迭代器,与begin和end位置相同,但不能修改其空间内容
[crbegin(), crend()) const反向迭代器,与crbegin在cend位置,crend在cbegin位置
#include <iostream>
#include <deque>

using namespace std;

int main()
{
	int arr[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
	deque<int> d(arr, arr + sizeof(arr) / sizeof(arr[0]));

	deque<int>::iterator it = d.begin();
	while (it != d.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;

	deque<int>::reverse_iterator rit = d.rbegin();
	while (rit != d.rend())
	{
		cout << *rit << " ";
		rit++;
	}
	cout << endl;

	system("pause");
	return 0;
}

3、deque的基本操作

函数声明 接口说明
size() 返回deque中有效元素个数
empty() 检测deque是否为空,是返回true,否则返回false
resize(sz, value) 将deque中的元素改变到sz,多出的空间用value填充
operator[] 返回deque中n位置上元素的引用
front() 返回deque中首元素的引用
back() 返回deque中最后一个元素的引用
push_back() 和 pop_back() deque的尾插和尾删
push_front() 和 pop_front() deque任意位置插入和删除
insert(pos, value) 和 erase(pos) 删除deque头部元素
swap() 交换两个deque中的内容
clear() 将deque中的元素清空
#include <iostream>
#include <deque>

using namespace std;

int main()
{
	int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
	deque<int> d(arr, arr + sizeof(arr) / sizeof(arr[0]));

	d.push_back(10);
	d.push_front(0);

	for (auto& e : d)
	{
		cout << e << " ";
	}
	cout << endl;

	cout << d.size() << endl;
	cout << d.front() << endl;
	cout << d.back() << endl;

	d.insert(d.begin(), 0);

	for (auto& e : d)
	{
		cout << e << " ";
	}
	cout << endl;

	d.erase(d.begin());
	d.pop_back();
	d.pop_front();

	for (auto& e : d)
	{
		cout << e << " ";
	}
	cout << endl;

	d.clear();
	
	cout << d.size() << endl;

	system("pause");
	return 0;
}

4、deque的排序效率问题

注:
deque中排序的效率很低,当对deque排序的时候,需要多次对deque中的元素进行整体遍历,而deque的遍历很低,deque的空间不连续。

#include <iostream>
#include <deque>
#include <algorithm>

using namespace std;

int main()
{
	int arr[] = { 3, 2, 4, 5, 1, 8, 9, 7, 6 };
	deque<int> d(arr, arr + sizeof(arr) / sizeof(arr[0]));

	for (auto& e : d)
	{
		cout << e << " ";
	}
	cout << endl;

	sort(d.begin(), d.end());

	for (auto& e : d)
	{
		cout << e << " ";
	}
	cout << endl;

	system("pause");
	return 0;
}

5、deque的应用场景

deque的作用是做stack和queue的底层结构

发布了117 篇原创文章 · 获赞 48 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/gp1330782530/article/details/105435341