簡介:
deque雙端隊列容器(double-ended queue)與vector非常相似,演算法的時間複雜度也是常數階O(1),deque內部的資料機制和執行效能與vector不同,一般說來,當考慮到容器元素的記憶體配置策略和操作的效能時,deque相對vector較為有優勢。deque雙端隊列採用分塊的線性結構來儲存資料,具有高效的刪除首尾元素的函數,由於deque容器是以deque塊為單位進行記憶體的分配,並使用了二級的Map進行管理,因此不容易實作類別似於vector的capacity和reverse函數,而且deque容器也不需要這樣的擷取和調整容器大小的函數。
deque應用基礎:
建立deque對象:
1、deque() 建立一個空的deque對象。
如:deque<int> d;
2、deque(size_type n) 建立一個具有n個元素的deque對象,每個deque元素具有它的類型下的預設值。
如:deque<int> d(10);
3、deque(size_type n, const T& value) 建立一個具有n個元素的deque對象,每個元素具有初始值value。
如:deque<int> d(10, 5);
4、deque(const deque&) 通過拷貝一個deque對象的各個元素值,建立一個新的deque對象。
如:deque<int> d1(10, 5); deque<int> d2(d1);
5、deque(const InputIterator first, const InputIterator last, const A& a=A()) 通過拷貝迭代器區間[first, last)的元素值,建立一個新的deque對象中,記憶體 Clerk可省略。
如:int iArray[] = {1,2,3}; deque<int> d(iArray, iArray+3);
初始化賦值:
deque提供的push_back函數常用來進行deque容器的初始化,push_back函數在容器的尾端插入新元素value。
void push_back(const T&)
元素的遍曆訪問:
deque的元素可採用數組或迭代器的方式進行遍曆訪問。
元素的插入:
由於deque使用了兩個迭代器分別指向雙端隊列的首尾,因此deque具有高效的頭部插入元素的函數push_front()
void push_front(const T&)
其它位置的插入,將涉及相關元素的移位拷貝,insert函數的一個較常用的原型為:
iterator insert(iterator pos, const T& x)
元素的刪除:
void pop_front() 刪除deque的第一個元素
void pop_back() 刪除deque的最後一個元素
iterator erase(iterator pos) 刪除迭代器pos所指的元素
iterator erase(iterator first, iterator last) 刪除迭代器區間[first, last)的所有元素
void clear() 調用erase函數,清除所有元素
元素的反向遍曆:
reverse_iterator rbegin()
reverse_iterator rend()
deque的交換:
void swap(deque&)
其它常用函數:
bool empty()
size_type size()
size_type max_size()
reference front()
reference back()
舉例分析:
1、
//用數組的方式訪問deque元素#include <iostream>#include <deque>using namespace std;int main(void){deque<int> d;d.push_back(13);d.push_back(32);d.push_back(29);for (int i=0; i<d.size(); i++){ cout << "d[" << i << "] = " << d[i] << endl;}return 0;}
2、
//用迭代器訪問deque元素#include <deque>#include <iostream>using namespace std;int main(void){deque<string> d;d.push_back("a");d.push_back("b");d.push_back("c");deque<string>::iterator i, iend;iend = d.end();int j;for (i=d.begin(),j=0; i!=iend; i++,j++){ cout << *i << " ";}cout << endl;return 0;}
3、
//頭部和中間位置插入deque元素#include <deque>#include <iostream>using namespace std;int main(void){deque<int> d;d.push_back(6);d.push_back(7); //頭部插入d.push_front(5);for (int i=0; i<d.size(); i++){ cout << d[i] << " ";}cout << endl;//中間位置插入d.insert(d.begin()+1, 9);for (int j=0; j<d.size(); j++){ cout << d[j] << ' ';}cout << endl;return 0;}
4、
//頭尾和其它位置刪除deque元素#include <deque>#include <iostream>using namespace std;int main(void){deque<int> d;d.push_back(4);d.push_back(5);d.push_back(3);d.push_back(3);d.push_back(3);d.push_back(6);for (int i=0; i<d.size(); i++){ cout << d[i] << ' ' ;}cout << endl;//頭尾和任意位置刪除元素d.erase(d.begin()+1);d.pop_front();d.pop_back();for (int j=0; j<d.size(); j++){ cout << d[j] << ' ' ;}cout << endl;//刪除所有元素d.clear();cout << "執行clear()" << endl << "deque元素全部清除" << endl;return 0;}
5、
//deque元素的反向遍曆#include <deque>#include <iostream>using namespace std;int main(void){deque<int> d;d.push_back(1); d.push_back(3);d.push_back(5);d.push_back(7);d.push_back(9);//deque元素的前向遍曆deque<int>::iterator i, iend;iend = d.end();for (i=d.begin(); i!=iend; i++){ cout << *i << " ";}cout << endl;//deque元素的反向遍曆deque<int>::reverse_iterator ri, riend;riend = d.rend();for (ri=d.rbegin(); ri!=riend; ri++){ cout << *ri << " ";}cout << endl;return 0;}
//deque元素的反向遍曆#include <deque>#include <iostream>using namespace std;int main(void){deque<int> d;d.push_back(1); d.push_back(3);d.push_back(5);d.push_back(7);d.push_back(9);//deque元素的前向遍曆deque<int>::iterator i, iend;iend = d.end();for (i=d.begin(); i!=iend; i++){ cout << *i << " ";}cout << endl;//deque元素的反向遍曆deque<int>::reverse_iterator ri, riend;riend = d.rend();for (ri=d.rbegin(); ri!=riend; ri++){ cout << *ri << " ";}cout << endl;return 0;}
6、
//兩個deque容器的元素交換#include <deque>#include <iostream>using namespace std;void print(deque<int>& d){for (int i=0; i<d.size(); i++){ cout << d[i] << " ";}cout << endl;}int main(void){deque<int> d1;d1.push_back(11);d1.push_back(12);d1.push_back(13);cout << "d1 = ";print(d1);deque<int> d2;d2.push_back(90);d2.push_back(91);d2.push_back(92);cout << "d2 = ";print(d2);//d1和d2交換d1.swap(d2);cout << "d1與d2交換後" << endl;cout << "d1 = ";print(d1);cout << "d2 = ";print(d2);return 0;}
7、
//deque其它常用函數的使用#include <deque>#include <iostream>using namespace std;int main(void){deque<string> d;//列印deque為空白cout << "d是否為空白: " << d.empty() << endl;//裝入元素d.push_back("紅樓夢");d.push_back("源氏物語");d.push_back("教父");d.push_back("水滸傳");d.push_back("24史");//列印deque所有元素deque<string>::iterator i, iend;iend = d.end();for (i=d.begin(); i!=iend; i++){ cout << *i << " ";}cout << endl;//列印首元素cout << "deque首元素為: " << d.front() << endl;//列印末元素cout << "deque末元素為: " << d.back() << endl;//列印元素個數cout << "deque元素個數為: " << d.size() << endl;//列印可支援的最大deque元素個數cout << "deque最大元素個數為: " << d.max_size() << endl;return 0;}