一、deque的介紹
1、deque是一種動態大小的雙端隊列,屬於序列式容器,兩端均可伸縮;
2、特定的庫可以以不同的方式實現deque ,但是通常都是一種動態數組,不論任何情況下,它都允許通過隨機訪問迭代器的方式直接訪問單個元素,可以根據需要動態伸縮;
3、deque 提供了一些與 vector 類似的功能,但是 deque 在頭部和尾部的插入過程中效率更高,與 vector 不同的是,deque 不能保證所有的元素存儲在連續空間中,在 deque 中通過指針加偏移量的方式訪問元素可能會導致非法操作;
4、vector 與 list 提供了一些類似的接口,但是內部實現原理不同:vector 使用了動態數組,deque 中的元素可能分散在不同的存儲塊中,在deque中保存了一些必要的信息,通常用來在常數範圍內直接訪問 deque的任何一個元素, 所以deque 的內部實現比 vector 複雜;
5、除了在頻繁的頭、尾插入和刪除外,deque 比list 和 forward_list性能更差;
二、deque的使用
1、deque的構造
函數聲明 | 接口說明 |
deque() |
構造空的雙端隊列 |
deque(size_type n,const value_type& val = value_type()) |
用n個val來構造雙端隊列 |
deque(Inputlterator first,Inputlterator last) | 用[first,last)區間裏構造 |
deque(const deque& x) | 拷貝構造 |
void MakeDequeTest() {
deque<int> d1;
deque<int> d2(5);
deque<int> d3(5, 5);
vector<int> v{ 9,5,2,7 };
deque<int> d4(v.begin(),v.end());
deque<int> d5(d4);
PrintDeque(d1);
PrintDeque(d2);
PrintDeque(d3);
PrintDeque(d4);
PrintDeque(d5);
}
2、deque的迭代器
雙端隊列底層是一段假象的連續空間,實際上是分層的,爲了維護其假象,落在了deque的迭代器上;
函數聲明 | 接口說明 |
iterator begin() | 返回deque的起始位置 |
iterator end() | 返回deque最後一個元素的下一位置 |
reverse_iterator rbegin() | 返回deque其實位置的反向迭代器(end) |
reverse_iterator rend() | 返回deque最後一個元素的下一位置(begin) |
const_iterator cbegin() const | 返回deque起始位置的const 迭代器 |
cnost_iterator cend() const |
返回deque最後一個元素的下一位置const |
const_reverse_iterator crbegin() const | 返回deque起始位置(crend) |
const_reverse_iterator crend() const | 返回deque最後一個元素下個位置(crbegin) |
void DequeIteratorTest() {
int array[] = { 1,2,3,4,5,6,7,8,9 };
deque<int> d(array, array + sizeof(array) / sizeof(int));
for (auto it = d.cbegin(); it != d.cend(); ++it)
cout << *it << " ";
cout << endl;
for (auto it = d.crbegin(); it != d.crend(); ++it)
cout << *it << " ";
cout << endl;
}
3、deque capacity
函數聲明 | 接口說明 |
size_type size() cosnt | 返回deque中有效元素個數 |
bool empty() const | 檢測deque是否爲空 |
void resize(size_type sz,T c = T()) | 將deque的元素改變到sz個,多餘部分填c |
4、deque的元素訪問操作
函數聲明 |
接口說明 |
reference operator[](size_type n) | 返回n位置上元素的引用 |
const_reference operator[](size_type n)const |
返回n位置上元素的cosnt 引用 |
reference front() |
返回首元素的引用 |
const_reference front() cosnt | 返回首元素的const 引用 |
reference back() | 返回最後一個元素的引用 |
const_reference back() cosnt |
返回最後一個元素的cosnt 引用 |
5、deque中修改操作
函數聲明 |
接口說明 |
void push_back(const value_type* val) | 尾插 |
void pop_back() | 尾刪 |
void push_front(const valuse_type* val) | 頭插 |
void pop_front() | 頭刪 |
iterator insert(iterator position,const value_type& val) |
在pos插入val |
void insert(iterator position,size_type n,const value_type& val) |
在pos插入n個val |
void insert(iterator position,Inputlterator frist,Inputlterator last) | 在pos插入[frist,last) |
iterator erase(iterator position) | 刪除pos,並返回下一個位置 |
iterator erase(iterator first,iterator last) | 刪除[frist,last),並返回last的位置 |
void swap(deque& x) |
交換 |
void clear() |
清空 |
iterator empalce(const_iterator position,Args.. args) |
在pos處構造元素,將元素所需要內容通過參數類表傳入 |
void empalce_front(Args.. args) |
在頭部構造元素 |
void empalce_backe(Args.. args) | 在尾部構造元素 |
void Test() {
deque<int> d1{ 3,4,5 };
d1.push_back(6);
d1.push_front(2);
PrintDeque(d1);
cout << d1.size() << endl;
cout << d1.front() << endl;
cout << d1.back() << endl;
d1.emplace_back(7);
d1.emplace_front(1);
PrintDeque(d1);
d1.insert(d1.begin(), 0);
PrintDeque(d1);
d1.pop_front();
d1.pop_back();
d1.erase(d1.begin());
PrintDeque(d1);
d1.clear();
PrintDeque(d1);
}
三、deque的應用場景
deque在序列容器中是比較雞肋的,應用如果只是簡單的存儲元素,使用vector即可,如果對元素任意位置進入插入或者刪除操作比較多,使用vector即可,所以一般很少使用deque 。但是deque 的最大應用就是對 stack 和 queue 的底層結構;