deque雙向隊列是一種雙向開口的連續線性空間,能夠高效的在頭尾兩端插入和刪除元素,deque在接口上和vector很是類似,下面列出deque的經常使用成員函數:windows
![](http://static.javashuo.com/static/loading.gif)
deque的實現比較複雜,內部會維護一個map(注意!不是STL中的map容器)即一小塊連續的空間,該空間中每一個元素都是指針,指向另外一段(較大的)區域,這個區域稱爲緩衝區,緩衝區用來保存deque中的數據。所以deque在隨機訪問和遍歷數據會比vector慢。具體的deque實現能夠參考《STL源碼剖析》,固然此書中使用的SGI STL與VS2008所使用的PJ STL的實現方法仍是有區別的。下面給出了deque的結構圖:ide
![](http://static.javashuo.com/static/loading.gif)
因爲篇幅問題,deque的實現細節就再也不深刻了,下面給出deque的使用範例:函數
//雙向隊列 deque spa
- //by MoreWindows http://blog.csdn.net/morewindows
- #include <deque>
- #include <cstdio>
- #include <algorithm>
- using namespace std;
- int main()
- {
- deque<int> ideq(20); //Create a deque ideq with 20 elements of default value 0
- deque<int>::iterator pos;
- int i;
-
- //使用assign()賦值 assign在計算機中就是賦值的意思
- for (i = 0; i < 20; ++i)
- ideq[i] = i;
-
- //輸出deque
- printf("輸出deque中數據:\n");
- for (i = 0; i < 20; ++i)
- printf("%d ", ideq[i]);
- putchar('\n');
-
- //在頭尾加入新數據
- printf("\n在頭尾加入新數據...\n");
- ideq.push_back(100);
- ideq.push_front(i);
-
- //輸出deque
- printf("\n輸出deque中數據:\n");
- for (pos = ideq.begin(); pos != ideq.end(); pos++)
- printf("%d ", *pos);
- putchar('\n');
-
- //查找
- const int FINDNUMBER = 19;
- printf("\n查找%d\n", FINDNUMBER);
- pos = find(ideq.begin(), ideq.end(), FINDNUMBER);
- if (pos != ideq.end())
- printf("find %d success\n", *pos);
- else
- printf("find failed\n");
-
- //在頭尾刪除數據
- printf("\n在頭尾刪除數據...\n");
- ideq.pop_back();
- ideq.pop_front();
-
- //輸出deque
- printf("\n輸出deque中數據:\n");
- for (pos = ideq.begin(); pos != ideq.end(); pos++)
- printf("%d ", *pos);
- putchar('\n');
- return 0;
- }
運行結果以下:.net
![](http://static.javashuo.com/static/loading.gif)
另外要注意一點。對於deque和vector來講,儘可能少用erase(pos)和erase(beg,end)。由於這在中間刪除數據後會致使後面的數據向前移動,從而使效率低下。指針