廈門(mén)seo公司網(wǎng)站應(yīng)該如何進(jìn)行優(yōu)化
鶴壁市浩天電氣有限公司
2026/01/24 17:37:45
廈門(mén)seo公司,網(wǎng)站應(yīng)該如何進(jìn)行優(yōu)化,做教育網(wǎng)站還掙錢(qián)嗎,多語(yǔ)言網(wǎng)站怎么實(shí)現(xiàn)STL deque 的詳細(xì)特征
基本特性
#include deque
using namespace std;dequeint dq; // 聲明一個(gè)int類型的雙端隊(duì)列 雙端隊(duì)列#xff1a;允許在兩端進(jìn)行高效插入和刪除動(dòng)態(tài)數(shù)組#xff1a;支持隨機(jī)訪問(wèn)#xff0c;可以像數(shù)組一樣通過(guò)下標(biāo)訪問(wèn)內(nèi)存結(jié)構(gòu)dequeusingnamespacestd;dequeintdq;// 聲明一個(gè)int類型的雙端隊(duì)列· 雙端隊(duì)列允許在兩端進(jìn)行高效插入和刪除· 動(dòng)態(tài)數(shù)組支持隨機(jī)訪問(wèn)可以像數(shù)組一樣通過(guò)下標(biāo)訪問(wèn)· 內(nèi)存結(jié)構(gòu)分段連續(xù)存儲(chǔ)由多個(gè)固定大小的內(nèi)存塊組成內(nèi)存結(jié)構(gòu)與實(shí)現(xiàn)原理內(nèi)部結(jié)構(gòu)示意圖deque內(nèi)存布局 [塊1] → [塊2] → [塊3] → [塊4] → [塊5] ↓ ↓ ↓ ↓ ↓ [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] ↑front ↑back 每個(gè)塊固定大小通常是512字節(jié)或容納元素的內(nèi)存對(duì)齊大小 維護(hù)一個(gè)中央控制器map存儲(chǔ)各個(gè)塊的指針關(guān)鍵特征// 1. 分塊存儲(chǔ)// deque將元素存儲(chǔ)在多個(gè)固定大小的內(nèi)存塊中// 當(dāng)需要擴(kuò)容時(shí)分配新的內(nèi)存塊而不是重新分配整個(gè)數(shù)組// 2. 隨機(jī)訪問(wèn)復(fù)雜度 O(1)dequeintdq{1,2,3,4,5};coutdq[2];// O(1) 訪問(wèn)// 3. 兩端操作復(fù)雜度 O(1)dq.push_front(0);// O(1)dq.push_back(6);// O(1)dq.pop_front();// O(1)dq.pop_back();// O(1)時(shí)間復(fù)雜度分析操作 時(shí)間復(fù)雜度 說(shuō)明push_front() O(1) 平均分?jǐn)俻ush_back() O(1) 平均分?jǐn)俻op_front() O(1) 平均分?jǐn)俻op_back() O(1) 平均分?jǐn)俹perator[] O(1) 隨機(jī)訪問(wèn)insert() O(n) 中間插入erase() O(n) 中間刪除front()/back() O(1) 訪問(wèn)首尾與 vector/list 的對(duì)比性能對(duì)比#includedeque#includevector#includelist#includeiostreamvoidbenchmark(){// 1. 前端插入 - deque 最優(yōu)dequeintdq;vectorintvec;listintlst;// push_front 測(cè)試for(inti0;i100000;i){dq.push_front(i);// 快O(1)lst.push_front(i);// 快O(1)vec.insert(vec.begin(),i);// 慢O(n)}}詳細(xì)對(duì)比表特性 deque vector list內(nèi)存布局 分段連續(xù) 連續(xù) 不連續(xù)隨機(jī)訪問(wèn) O(1) O(1) O(n)前端插入 O(1) O(n) O(1)后端插入 O(1) 分?jǐn)侽(1) O(1)中間插入 O(n) O(n) O(1)內(nèi)存開(kāi)銷 中等 低 高緩存友好 中等 高 低迭代器類型 隨機(jī)訪問(wèn) 隨機(jī)訪問(wèn) 雙向迭代器特征迭代器特性dequeintdq{1,2,3,4,5};// 1. 隨機(jī)訪問(wèn)迭代器autoitdq.begin();it3;// 支持隨機(jī)訪問(wèn)cout*it;// 輸出4// 2. 迭代器失效規(guī)則dq.push_front(0);// 所有迭代器失效dq.push_back(6);// 所有迭代器失效// 3. 插入/刪除中間元素itdq.begin()2;dq.insert(it,99);// it失效迭代器失效情況操作 迭代器失效情況push_front() 所有迭代器失效push_back() 所有迭代器失效pop_front() 指向被刪元素的迭代器失效pop_back() 指向被刪元素的迭代器失效insert() 所有迭代器失效erase() 被刪位置之后的迭代器失效resize() 所有迭代器失效常用操作示例基本操作#includedeque#includeiostream#includealgorithmvoidbasic_operations(){dequeintdq;// 1. 兩端插入dq.push_back(10);// 后: 10dq.push_front(5);// 前: 5, 后: 10 → 5,10dq.emplace_back(15);// C11: 5,10,15dq.emplace_front(0);// C11: 0,5,10,15// 2. 訪問(wèn)元素cout第一個(gè)元素: dq.front()endl;// 0cout最后一個(gè)元素: dq.back()endl;// 15cout第三個(gè)元素: dq[2]endl;// 10cout大小: dq.size()endl;// 4// 3. 刪除元素dq.pop_front();// 移除0 → 5,10,15dq.pop_back();// 移除15 → 5,10// 4. 中間操作dq.insert(dq.begin()1,7);// 5,7,10dq.erase(dq.begin()1);// 移除7 → 5,10// 5. 清空和檢查dq.clear();cout是否為空: dq.empty()endl;// true}高級(jí)用法voidadvanced_usage(){// 1. 構(gòu)造函數(shù)dequeintdq1(5,100);// 5個(gè)100dequeintdq2{1,2,3,4,5};// 初始化列表dequeintdq3(dq2.begin(),dq2.begin()3);// 復(fù)制部分// 2. 交換dequeinta{1,2,3};dequeintb{4,5,6};a.swap(b);// O(1)操作// 3. 調(diào)整大小dequeintdq{1,2,3};dq.resize(5);// 變?yōu)? 1,2,3,0,0dq.resize(2);// 變?yōu)? 1,2dq.resize(4,99);// 變?yōu)? 1,2,99,99// 4. 容量相關(guān)dequeintdq4;dq4.reserve(100);// ? deque沒(méi)有reserve()// 只能通過(guò)resize預(yù)先分配空間dq4.resize(100);// 分配100個(gè)元素空間}實(shí)際應(yīng)用場(chǎng)景場(chǎng)景1滑動(dòng)窗口// 滑動(dòng)窗口最大值vectorintmaxSlidingWindow(vectorintnums,intk){dequeintdq;// 存儲(chǔ)下標(biāo)vectorintresult;for(inti0;inums.size();i){// 移除窗口外的元素if(!dq.empty()dq.front()i-k)dq.pop_front();// 維護(hù)單調(diào)遞減隊(duì)列while(!dq.empty()nums[dq.back()]nums[i])dq.pop_back();dq.push_back(i);if(ik-1)result.push_back(nums[dq.front()]);}returnresult;}場(chǎng)景2任務(wù)隊(duì)列classTaskScheduler{private:dequepairint,stringtaskQueue;// 優(yōu)先級(jí), 任務(wù)名public:voidaddHighPriorityTask(string task){taskQueue.push_front({1,task});// 前端插入}voidaddLowPriorityTask(string task){taskQueue.push_back({0,task});// 后端插入}stringgetNextTask(){if(taskQueue.empty())return;string tasktaskQueue.front().second;taskQueue.pop_front();returntask;}};場(chǎng)景3回文字符串判斷boolisPalindrome(conststrings){dequechardq;// 填充deque忽略空格和大小寫(xiě)for(charc:s){if(isalnum(c))dq.push_back(tolower(c));}// 兩端比較while(dq.size()1){if(dq.front()!dq.back())returnfalse;dq.pop_front();dq.pop_back();}returntrue;}性能優(yōu)化技巧優(yōu)化建議// 1. 使用emplace代替pushC11及以上dequepairint,stringdq;dq.emplace_back(1,test);// 避免臨時(shí)對(duì)象構(gòu)造// 等價(jià)于: dq.push_back(make_pair(1, test));// 2. 預(yù)先分配空間dequeintdq;dq.resize(1000);// 如果知道大致大小預(yù)先分配// 3. 批量操作使用assigndq.assign(100,0);// 100個(gè)0比循環(huán)push_back快// 4. 避免頻繁的中間插入刪除// 如果需要頻繁中間操作考慮使用list// 5. 使用swap釋放內(nèi)存dequeintdq;// ... 使用dq ...dequeint().swap(dq);// 清空并釋放內(nèi)存注意事項(xiàng)常見(jiàn)陷阱// 1. 迭代器失效問(wèn)題dequeintdq{1,2,3,4,5};autoitdq.begin()2;dq.push_front(0);// ? it失效// cout *it; // 未定義行為// 2. 沒(méi)有capacity()和reserve()dequeintdq;// dq.capacity(); // ? 沒(méi)有這個(gè)函數(shù)// dq.reserve(100); // ? 沒(méi)有這個(gè)函數(shù)// 3. 中間操作性能差for(inti0;i10000;i){dq.insert(dq.begin()dq.size()/2,i);// O(n) 很慢}// 4. 內(nèi)存不是完全連續(xù)int*ptrdq[0];// ptr dq.size() 可能不指向有效內(nèi)存最佳實(shí)踐優(yōu)先使用deque的場(chǎng)景· 需要雙端隊(duì)列功能· 既需要隨機(jī)訪問(wèn)又需要兩端操作· 不確定前端還是后端操作更頻繁選擇vector的場(chǎng)景· 主要在后端操作· 需要連續(xù)內(nèi)存· 需要最高緩存友好性選擇list的場(chǎng)景· 頻繁在中間插入刪除· 不需要隨機(jī)訪問(wèn)· 需要穩(wěn)定的迭代器C11/14/17/20 新特性// C11: emplace, initializer_listdequeintdq{1,2,3,4,5};dq.emplace_front(0);// C17: try_emplace, insert_or_assign (對(duì)于map)// deque本身變化不大// C20: 范圍構(gòu)造vectorintvec{1,2,3,4,5};dequeintdq(vec.begin(),vec.end());// C20: 概念約束templatetypenameTrequiresstd::random_access_iteratortypenameT::iteratorvoidprocess(Tcontainer){// 只接受支持隨機(jī)訪問(wèn)的容器}總結(jié)deque是STL中一個(gè)平衡了隨機(jī)訪問(wèn)和兩端操作性能的數(shù)據(jù)結(jié)構(gòu)適用于特定的使用場(chǎng)景但需要注意其迭代器失效規(guī)則和內(nèi)存特性。