轉載請註明:http://www.cnblogs.com/ACshasow/ios
STL——deque學習筆記網絡
概念:數據結構
(deque,全名double-ended queue)是一種具備隊列和棧的性質的數據結構。雙端隊列中的元素能夠從兩端彈出,其限定插入和刪除操做在表的兩端函數
進行。性能
雙端隊列是限定插入和刪除操做在表的兩端進行的線性表。這兩端分別稱作端點1和端點2。也可像棧同樣,能夠用一個鐵道轉軌網絡來比喻雙端隊列。在實際使用中,還能夠有輸出受限的雙端隊列(即一個端點容許插入和刪除,另外一個端點只容許插入的雙端隊列)和輸入受限的雙端隊列(即一個端點容許插入和刪除,另外一個端點只容許刪除的雙端隊列)。而若是限定雙端隊列從某個端點插入的元素只能從該端點刪除,則該雙端隊列就蛻變爲兩個棧底相鄰的棧了學習
函數構造:大數據
deque<Elem> c 創建一個空的deque。spa
deque<Elem> c1(c2) 複製一個deque。code
deque<Elem> c(n) 建立一個deque,含有n個數據,數據均已缺省構造產生。htm
deque<Elem> c(n, elem) 建立一個含有n個elem拷貝的deque
deque<Elem> c(beg,end) 建立一個以[beg;end)區間的deque
c.~deque<Elem>() 銷燬全部數據,釋放內存
成員函數:
c.assign(beg,end) 將[beg; end)區間中的數據賦值給c。
c.assign(n,elem) 將n個elem的拷貝賦值給c。
c. at(idx) 傳回索引idx所指的數據,若是idx越界,拋出out_of_range。
c.back() 傳回最後一個數據,不檢查這個數據是否存在。
c.begin() 傳回迭代器中的第一個數據。
c.clear() 移除容器中全部數據。
c.empty() 判斷容器是否爲空。
c.end() 指向迭代器中的最後一個數據地址。
c.erase(pos) 刪除pos位置的數據,傳回下一個數據的位置。
c.erase(beg,end) 刪除[beg,end)區間的數據,傳回下一個數據的位置。
c.front() 傳回第一個數據。
get_allocator 使用構造函數返回一個拷貝。
c.insert(pos,elem) 在pos位置插入一個elem拷貝,傳回新數據位置
c.insert(pos,n,elem) 在pos位置插入>n個elem數據。無返回值
c.insert(pos,beg,end) 在pos位置插入在[beg,end)區間的數據。無返回值
c.max_size() 返回容器中最大數據的數量。
c.pop_back() 刪除最後一個數據。
c.pop_front() 刪除頭部數據。
c.push_back(elem) 在尾部加入一個數據。
c.push_front(elem) 在頭部插入一個數據。
c.rbegin() 傳回一個逆向隊列的第一個數據。
c.rend() 傳回一個逆向隊列的最後一個數據的下一個位置。
c.resize(num) 從新指定隊列的長度。
c.size() 返回容器中實際數據的個數。
c.swap(c2) 將c1和c2元素互換。
swap(c1,c2) 將c1和c2元素互換。
特色:
一、支持隨機訪問,即支持[]以及at(),可是性能沒有vector好。
二、支持兩端操做,push(pop)-back(front),但性能不及list。
最佳使用狀況:
一、須要在兩端插入和刪除元素。
二、無需引用容器內的元素。
三、要求容器釋放再也不使用的元素。
示例:
#include <iostream> #include<deque> using namespace std; int main() { deque<int> mydeque (7,6); // 初始化deque爲7個int,每一個int值爲6 mydeque.push_front(2); //插入頭 mydeque.push_back(3); //插入尾 cout << "mydeque size: " << mydeque.size() << endl; cout << "mydeque contains:"; for (unsigned i=0; i<mydeque.size();i++) cout << " " << mydeque[i]; cout << endl; return 0; }
vector、list、deque、三個容器的選擇:
一、若是你須要高效的隨即存取,而不在意插入和刪除的效率,使用vector
二、若是你須要大量的插入和刪除,而不關心隨即存取,則應使用list
三、若是你須要隨即存取,並且關心兩端數據的插入和刪除,則應使用deque。