from:http://blog.csdn.net/morewindows/article/details/6946811
deque雙向隊列是一種雙向開口的連續線性空間,可以高效的在頭尾兩端插入和删除元素,deque在接口上和vector非常相似,下面列出deque的常用成員函數:
deque的實作比較複雜,内部會維護一個map(注意!不是STL中的map容器)即一小塊連續的空間,該空間中每個元素都是指針,指向另一段(較大的)區域,這個區域稱為緩沖區,緩沖區用來儲存deque中的資料。是以deque在随機通路和周遊資料會比vector慢。具體的deque實作可以參考《STL源碼剖析》,當然此書中使用的SGI STL與VS2008所使用的PJ STL的實作方法還是有差別的。下面給出了deque的結構圖:
由于篇幅問題,deque的實作細節就不再深入了,下面給出deque的使用範例:
[cpp] view plain copy
- //雙向隊列 deque
- //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;
- }
運作結果如下:
另外要注意一點。對于deque和vector來說,盡量少用erase(pos)和erase(beg,end)。因為這在中間删除資料後會導緻後面的資料向前移動,進而使效率低下。