例說資料結構&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————deque容器
- STL容器之deque
- STL_deque容器
- STL使用篇__deque
- STL-queue&deque&stack
- C++ STL deque容器C++
- C++ STL第三篇(搞清楚deque原理和有多少用法)C++
- 資料結構:線性表-例題資料結構
- 傳說中的資料結構_JAVA資料結構Java
- 【PG結構】Postgresql資料庫資料目錄說明SQL資料庫
- 從一條資料說起——InnoDB儲存資料結構資料結構
- 《大話資料結構》讀後總結(三)資料結構
- 說說你對資料結構的理解?有哪些?區別?資料結構
- 重學資料結構(三、佇列)資料結構佇列
- Python 資料結構視訊教程三Python資料結構
- 2. STL容器結構與分類
- Redis資料結構三之壓縮列表Redis資料結構
- Redis 的基礎資料結構(三)物件Redis資料結構物件
- 結構化資料、半結構化資料和非結構化資料
- 【資料結構篇】認識資料結構資料結構
- 【資料結構與演算法】通俗易懂說連結串列資料結構演算法
- JS版資料結構第三篇(連結串列)JS資料結構
- 侯捷C++ STL體系結構與原始碼剖析:關於moveable的說明C++原始碼
- Android中需要了解的資料結構(三)Android資料結構
- Java資料結構與排序演算法 (三)Java資料結構排序演算法
- 資料結構小白系列之資料結構概述資料結構
- 資料庫知識整理 - 概述、資料模型、三級模式結構資料庫模型模式
- 資料結構資料結構
- Redis 5種資料結構及其使用場景舉例--STRINGRedis資料結構
- 【學習】體系結構-001-例項與資料庫資料庫
- 用Python解決資料結構與演算法問題(三):線性資料結構之棧Python資料結構演算法
- 資料結構與演算法-資料結構(棧)資料結構演算法
- 資料結構 - 樹,三探之程式碼實現資料結構
- Redis List 底層三種資料結構原理剖析Redis資料結構
- Characters_of_the_Three_Kingdoms – 三國人物結構化資料
- deque
- 如何定義一個自帶資料區的結構體:三種資料結構體的比較結構體資料結構
- 【PHP資料結構】PHP資料結構及演算法總結PHP資料結構演算法
- leetcode演算法資料結構題解---資料結構LeetCode演算法資料結構