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的效率比較底下。

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