一文帶你了解C++中deque的使用
1)deque的定義及基本用法
要使用deque,我們需要包含頭文件,定義deque對象如下:
#include <deque> using namespace std; deque<int> dq; // 定義deque對象dq,其中元素類型為int型
deque支持的基本操作如下:
- 在deque的隊(duì)首插入元素:push_front()方法。
- 在deque的隊(duì)尾插入元素:push_back()方法。
- 刪除deque隊(duì)首的元素:pop_front()方法。
- 刪除deque隊(duì)尾的元素:pop_back()方法。
- deque的長度:size()方法。
- 判斷deque是否為空:empty()方法。
- 訪問deque隊(duì)首元素:front()方法。
- 訪問deque隊(duì)尾元素:back()方法。
示例代碼如下:
#include <iostream> #include <deque> using namespace std; int main() { deque<int> dq; dq.push_front(1); // 在隊(duì)首插入元素1 dq.push_back(2); // 在隊(duì)尾插入元素2 dq.push_front(3); // 在隊(duì)首插入元素3 dq.pop_back(); // 刪除隊(duì)尾元素2 cout << "長度:" << dq.size() << endl; // 打印長度 while(!dq.empty()){ cout << dq.front() << ' '; // 打印隊(duì)列中的每一個(gè)元素 dq.pop_front(); // 刪除隊(duì)首元素 } return 0; }
執(zhí)行結(jié)果:
長度:2
3 1
2)deque的迭代器
deque支持迭代器,可以按照指針的方式遍歷deque中的所有元素。deque迭代器支持前向訪問,但不支持隨機(jī)訪問,即不支持下標(biāo)操作。deque迭代器又分為普通迭代器和反向迭代器,可以分別用begin(),end(),rbegin(),rend()方法來獲取。
示例代碼如下:
#include <iostream> #include <deque> using namespace std; int main() { deque<int> dq; dq.push_front(1); dq.push_back(2); dq.push_back(3); dq.push_front(4); cout << "正向遍歷:"; for(deque<int>::iterator it=dq.begin();it!=dq.end();it++) cout << *it << ' '; // 打印所有元素 cout << endl; cout << "反向遍歷:"; for(deque<int>::reverse_iterator it=dq.rbegin();it!=dq.rend();it++) cout << *it << ' '; // 打印所有元素(反向) cout << endl; return 0; }
執(zhí)行結(jié)果:
正向遍歷:4 1 2 3
反向遍歷:3 2 1 4
3)deque的性能
對于在最差情況下,即內(nèi)存池容量已滿的情況,deque在表現(xiàn)上比較優(yōu),它的時(shí)間復(fù)雜度為O(1),因?yàn)閐eque在前端和后端進(jìn)行插入和刪除的操作所需時(shí)間復(fù)雜度為O(1),但如果在中間進(jìn)行插入和刪除,則時(shí)間復(fù)雜度為O(N),因?yàn)橐驗(yàn)樾枰押竺娴脑赝笠苿?dòng)。同時(shí),它的空間復(fù)雜度為O(N),其中N表示deque中元素的個(gè)數(shù)。
4)deque的應(yīng)用:滑動(dòng)窗口問題
滑動(dòng)窗口問題是指在一個(gè)序列中找出所有長度為k的子序列,并且每次移動(dòng)一個(gè)單位,重復(fù)執(zhí)行這個(gè)操作,最終得到所有的子序列。這個(gè)問題在處理字符串問題,尤其是搜索問題中經(jīng)常出現(xiàn)。我們可以用deque來解決這個(gè)問題,將待處理的數(shù)據(jù)元素存入到deque中,每次向右滑動(dòng)窗口的時(shí)候從左邊移除最先加入的元素,同時(shí)從右邊添加一個(gè)新的元素。
示例代碼如下:
#include <iostream> #include <deque> using namespace std; void printMax(int arr[], int n, int k) { deque<int> dq; // 存儲(chǔ)元素下標(biāo),用于判斷窗口是否失效,同時(shí)也維護(hù)了單調(diào)性 for (int i=0; i<k; i++) { while (!dq.empty() && arr[i] >= arr[dq.back()]) dq.pop_back(); // 維護(hù)單調(diào)性,刪除隊(duì)列中元素使其單調(diào)遞增 dq.push_back(i); // 將元素下標(biāo)存入隊(duì)列 } for (int i=k; i<n; i++) { cout << arr[dq.front()] << " "; // 打印當(dāng)前窗口中的最大值 while (!dq.empty() && dq.front() <= i-k) dq.pop_front(); // 刪除隊(duì)首元素,判斷隊(duì)首元素是否已失效 while (!dq.empty() && arr[i] >= arr[dq.back()]) dq.pop_back(); // 維護(hù)單調(diào)性,刪除隊(duì)列中元素使其單調(diào)遞增 dq.push_back(i); // 將元素下標(biāo)存入隊(duì)列 } cout << arr[dq.front()] << endl; // 打印最后一個(gè)窗口中的最大值 } int main() { int arr[] = {4, 3, 5, 4, 2, 5, 6, 7}; int n = sizeof(arr) / sizeof(arr[0]); int k = 3; printMax(arr, n, k); return 0; }
此示例代碼中,我們定義了一個(gè)deque用于存儲(chǔ)元素下標(biāo),同時(shí)維護(hù)單調(diào)性,使得隊(duì)列中的元素單調(diào)遞增。在每次可取的滑動(dòng)窗口過程中,只需找到隊(duì)列中的最大值。這個(gè)示例中的時(shí)間復(fù)雜度為O(N)。
以上便是關(guān)于C++中deque的基本用法和應(yīng)用的相關(guān)介紹,希望對你有所幫助。
到此這篇關(guān)于一文帶你了解C++中deque的使用的文章就介紹到這了,更多相關(guān)C++ deque內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺析內(nèi)存對齊與ANSI C中struct型數(shù)據(jù)的內(nèi)存布局
當(dāng)在C中定義了一個(gè)結(jié)構(gòu)類型時(shí),它的大小是否等于各字段(field)大小之和?編譯器將如何在內(nèi)存中放置這些字段?ANSI C對結(jié)構(gòu)體的內(nèi)存布局有什么要求?而我們的程序又能否依賴這種布局2013-09-09Matlab實(shí)現(xiàn)簡單擴(kuò)頻語音水印算法詳解
本文主要介紹了通過MATLAB設(shè)計(jì)并實(shí)現(xiàn)一種基于音頻的擴(kuò)頻水印算法,從而了解參數(shù)對擴(kuò)頻水印算法性能的影響。代碼具有一定的價(jià)值,感興趣的小伙伴可以關(guān)注一下2021-11-11C++實(shí)現(xiàn)LeetCode(71.簡化路徑)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(71.簡化路徑),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07淺談C語言共用體和與結(jié)構(gòu)體的區(qū)別
下面小編就為大家?guī)硪黄獪\談C語言共用體和與結(jié)構(gòu)體的區(qū)別。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-02-02OpenCV實(shí)現(xiàn)簡單攝像頭視頻監(jiān)控程序
這篇文章主要為大家詳細(xì)介紹了OpenCV實(shí)現(xiàn)簡單攝像頭視頻監(jiān)控程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-08-08C++與QML進(jìn)行數(shù)據(jù)交互實(shí)現(xiàn)方式介紹
迫于無奈開始寫android的程序,以前使用QWidget的方式試過,雖然界面可以實(shí)現(xiàn),但是最后調(diào)用攝像頭時(shí),未能成功,再?zèng)]有繼續(xù)。這幾天開始使用qml進(jìn)行嘗試,在使用的過程中,其中的一個(gè)難點(diǎn),就是在qml與c++中數(shù)據(jù)的交互2022-09-09