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