例說資料結構&STL(三)——deque

無鞋童鞋發表於2017-07-27

1 白話雙向佇列(deque)
  deque雙向佇列是一種雙向開口的連續線性空間,可以高效的在頭尾兩端插入和刪除元素,deque在STL中介面上和vector非常相似,此外它還是STL中queue和stack的底層依賴元件。


這裡寫圖片描述

  如上圖所示,deque擁有一個bitmap結構(稱之為map,並不是STL中容器map),map中每一個元素指向一塊連續的記憶體塊,後者才是真正儲存deque元素的地方,因為每個塊都是固定大小的,但是每個塊之間不要求是連續的,所以擴充空間的時候,就沒有vector那樣的副作用了,即無需“配置新空間 / 移動舊資料 / 釋放舊空間”的一套過程。
2 STL中deque實戰
 2.1 標頭檔案包含
  STL容器deque包含的標頭檔案如下形式:

#include<deque>

  其次一定要加上C++標準庫名稱空間std,可以在包含標頭檔案下面加上名稱空間using namespace std;
 2.2 型別定義
  和前面介紹的vector類似,這裡不太過多描述,直接看下面的程式。這塊例項我們使用C++中string類作為deque模板型別,當然這樣在開頭就需要包含對應的標頭檔案。

#include<deque>
#include<string> //注意與string.h的區別
using namespace std;

deque<string> deq_fir;

deque<string> deq_sed(10,"hello world!"); //初始化10個"hello world!"

deque<string> deq_thd(deq_sed.begin(),deq_sed.end()); //賦值deq_sed初始化deq_thd

 2.3 賦值操作

deq_fir.assign(10,"Boy");

deq_fir.assign(deq_thd.begin(),deq_thd.begin()+2); //賦值deq_thd前兩個字串給deq_fir。

 2.4 查詢元素

cout<<deq_fir.at(2)<<endl;   //查詢下標為2的元素

cout<<deq_fir[2]<<endl;      //同樣是查詢下標為2的元素,即第三個元素

cout<<deq_fir.front()<<endl; //查詢第一個元素

cout<<deq_fir.back()<<endl;  //查詢最後一個元素

 2.5 刪除操作

deq_fir.erase(deq_fir.begin()+5); //刪除第五個元素

deq_fir.erase(deq_fir.begin(),deq_fir.begin()+3); //刪除前三個元素

 2.6 插入操作

deq_fir.insert(deq_fir.begin(),10,"banana!"); //首部插入10個"banana!"字串

deq_Fir.insert(deq_fir.end(),"apple!"); //尾部插入一個“apple!”字串

 2.7 首尾刪除和新增操作

deq_fir.push_back("hello");  //尾部新增字串
deq_fir.push_front("world!");//首部新增字串

deq_fir.pop_back();          //尾部刪除一個元素
deq_fir.pop_front();         //首部刪除一個元素

 2.8 其他操作

if(!deq_fir.empty()) // 判斷是否為空deque
{
    deq_fir.clear(); // 清空操作
}

if(deq_fir.size() > 10) // 查詢空間元素個數
    deq_fir.resize(10); // 重新定義deque空間大小到10

deq_fir.swap(deq_sed);  // 交換兩個deque中所有資料

3 小結
  本篇博文我們主要介紹了資料結構中雙向佇列deque以及其在STL中定義的介面,相信大家有了一定的認識。deque內部是小片的連續空間,小片間用連結串列相連,實際上內部有一個map的指標,因為知道型別,所以還是可以使用[],只是速度沒有vector快。快速的訪問隨機的元素,快速的在開始和末尾插入元素,隨機的插入,刪除元素要慢,空間的重新分配要比vector快,重新分配空間後,原有的元素不需要拷貝。對deque的排序操作,可將deque先複製到vector,排序後在複製回deque。。
  以上是個人學習記錄,由於能力和時間有限,如果有錯誤望讀者糾正,謝謝!
  轉載請註明出處:http://blog.csdn.net/FX677588/article/details/76222608

相關文章