例說資料結構&STL(三)——deque
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
相關文章
- 例說資料結構&STL(十三)——pair資料結構AI
- 例說資料結構&STL(一)——vector資料結構
- 例說資料結構&STL(二)——list資料結構
- 例說資料結構&STL(四)——queue資料結構
- 例說資料結構&STL(五)——stack資料結構
- 例說資料結構&STL(六)——heap資料結構
- 例說資料結構&STL(八)——set資料結構
- 例說資料結構&STL(九)——map資料結構
- 例說資料結構&STL(十二)——iterator資料結構
- 例說資料結構&STL(七)——priority_queue資料結構
- 例說資料結構&STL(十)——hash_set/unordered_set資料結構
- 例說資料結構&STL(十一)——hash_map/unordered_map資料結構
- 《STL原始碼剖析》-- stl_deque.h原始碼
- 資料結構-棧&佇列&Deque實現比較資料結構佇列
- STL中經常使用資料結構資料結構
- C++ STL第三篇(搞清楚deque原理和有多少用法)C++
- 傳說中的資料結構_JAVA資料結構Java
- 監聽乙太網(三) Packet32資料結構說明 (轉)資料結構
- 【PG結構】Postgresql資料庫資料目錄說明SQL資料庫
- 從一條資料說起——InnoDB儲存資料結構資料結構
- 關於架構離不開資料結構之說架構資料結構
- 說說你對資料結構的理解?有哪些?區別?資料結構
- 《大話資料結構》讀後總結(三)資料結構
- 重學資料結構(三、佇列)資料結構佇列
- 學習 JavaScript 資料結構(三)——集合JavaScript資料結構
- 資料結構之三大查詢資料結構
- ECshop 每個資料庫表結構說明資料庫
- Python 資料結構視訊教程三Python資料結構
- Redis資料結構三之壓縮列表Redis資料結構
- Redis 的基礎資料結構(三)物件Redis資料結構物件
- Python中的三種資料結構Python資料結構
- Redis資料結構詳解之Set(三)Redis資料結構
- 結構化資料、半結構化資料和非結構化資料
- 【資料結構篇】認識資料結構資料結構
- 【資料結構與演算法】通俗易懂說連結串列資料結構演算法
- JS版資料結構第三篇(連結串列)JS資料結構
- 資料結構與演算法JavaScript (三) :連結串列資料結構演算法JavaScript
- 侯捷C++ STL體系結構與原始碼剖析:關於moveable的說明C++原始碼