C++容器(STL deque总结)---6

deque是双端队列不规则的首字母缩写,双端队列是动态大小的序列式容器,可以向两端进行伸缩

特定的库可以以不同的方式实现deque,但通常都是一种动态数组。不论在何种情况下,它都允许通过随机访问迭代器直接访问单个元素,可以根据需要动态的伸缩

deque提供了一些与vector相似的功能,但deque在头部和尾部进行数据插入和删除操作更加高效,与vector不同的是,deque不能保证所有的元素存储在连续的空间中,在deque中通过指针加偏移量方式访问元素可能会导致非法的操作

vector与list提供了相似的接口,因此具有类似的用途,但是内部的实现原理不同,vector使用了动态数组,该数组通常需要动态增长;deque中的元素可能分散在不同的存储快中,在deque中保存了一些必要的信息,通常用来在常数范围内直接访问deque中的任何一个元素,所以deque的内部实现比vector复杂,但是这些额外信息使得deque在某些增长下更加高效,特别是在序列比较大,重新分配成本比较高的情况下

双端队列底层是一段假象的连续空间,实际是分段连续的

 

//测试的确的构造函数

#include <iostream>
#include <stdlib.h>
#include <deque>

using namespace std;

void PrintDeque(const deque<int>& d)
{
	for (const auto &e :d)
	{
		cout << e << " ";
	}
	cout << endl;

}

void TestDeque1()
{
	//构造空的双端队列
	deque<int> d1;
	
	//用10个值为5的元素构造双端队列
	deque<int> d2(10, 5);
	PrintDeque(d2);

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

	//用d3拷贝构造d4
	deque<int> d4(d3);
	PrintDeque(d4);
}
int main()
{
	TestDeque1();

	system("pause");
	return 0;
}

//测试deque中的迭代器

void TestDeque2()
{
	int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
	deque<int> d(arr, arr + sizeof(arr) / sizeof(arr[0]));
	//正向迭代器打印deque中的元素
	for (auto it = d.cbegin(); it != d.cend(); ++it)
	{
		cout << *it << " ";
	}
	cout << endl;
	//反向迭代器打印deuqe中的元素
	for (auto it = d.crbegin(); it != d.crend(); ++it)
	{
		cout << *it << " ";
	}
	cout << endl;
}

void TestDeque3()
{
	//初始化,C++11用法
	deque<int>d1{ 2, 3, 4 };
	d1.push_back(5); //尾插5
	d1.push_front(1); //头插1
	PrintDeque(d1);
	
	cout << d1.size() << endl;
	cout << d1.front() << endl;
	cout << d1.back() << endl;

	// 如果是内置类型元素
	// emplace_back与push_back emplace_front与push_front的效率形同
	// 如果是自定义类型元素
	// emplace_back/emplace_front的效率更高,这两个操作直接在尾部或者头部构造元素
	// push_back/push_front的效率低,该操作时先将元素构造好,然后拷贝到尾部或头部
	d1.emplace_back(6); //尾插6
	d1.emplace_front(0); //头插0
	PrintDeque(d1);

	// 在deque的begin位置插入元素0
	d1.insert(d1.begin(), 0);
	PrintDeque(d1);
	// 删除deque首部与尾部元素
	d1.pop_front();
	d1.pop_back();
	d1.erase(d1.begin());
	PrintDeque(d1);
}

//deque中元素排序

void TestDeque4()
{
	int arr[] = { 2, 5, 6, 3, 67, 2, 5, 7, 2, 3, 4 };
	deque<int> d(arr, arr + sizeof(arr) / sizeof(arr[0]));
	PrintDeque(d);

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

}

     上述对deque中排序操作的效率是非常低的,当对deque排序时,需要多次对deque中的元素进行整体遍历,而 deque中的元素整体遍历时效率比较低,这是因为deque底层的空间不连续,如果要进行整体遍历,在某段空间的 默认或首部时,必须要计算下一段或者前一段空间的位置,导致deque的效率比较底下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章