手拆STL

vector

v e c t o r vector vector,動態數組。
先來看一下它的一些基本操作及其拆后殘渣。
1.a.push_back(x),將 x x x加入動態數組 a a a的末尾。
實現:a[++cnt]=x
2.a.size(),查詢動態數組 a a a中元素的數量。
實現:cnt
3.a.pop_back(),將動態數組 a a a末尾的元素刪除。
實現:cnt--
4.a.erase(a.begin()+x),刪除動態數組 a a a中第 x + 1 x+1 x+1個元素。
實現:for(int i=x+1;i<=--cnt;i++)a[i]=a[i+1];
5.a.clear(),清空動態數組 a a a
實現:cnt=0
總體實現:

int a[N];
int cnt;
void Push_back(int x){a[++cnt]=x;
}
int Size(){return cnt;
}
void Pop_back(){cnt--;
}
void Erase(int x){for(int i=x+1;i<=--cnt;i++)a[i]=a[i+1];
}
void Clear(){cnt=0;
}

queue

q u e u e queue queue,隊列。
隊列常用的操作:
1.q.push(x),向隊列 q q q中加入一個元素 x x x
實現:q[++tail]=x
2.q.pop(),彈出隊列 q q q的隊首。
實現: head++
3.q.front(),查詢隊列 q q q的隊首。
實現:q[head+1]
4.q.back(),查詢隊列 q q q的隊尾。
實現:q[tail]
5.q.empty(),判斷隊列 q q q是否為空。
實現:(head==tail)
6.q.size(),查詢隊列 q q q的元素個數
實現:tail-head
手寫的思想:兩個變量 h e a d head head t a i l tail tail h e a d head head存隊頭前一個元素的下標, t a i l tail tail存隊尾的下標。
總體實現:

int q[N];
int head,tail;
void Push(int x){q[++tail]=x;
}
void Pop(){head++;
}
int Front(){return q[head+1];
}
int Back(){return q[tail];
}
bool Empty(){return head==tail;
}
int Size(){return tail-head;
}

deque

d e q u e deque deque,雙端隊列。
一些基本操作:
1.q.push_back(x),在雙端隊列 q q q的隊尾加入一個元素 x x x
實現:q[++tail]=x
2.q.push_front(x),在雙端隊列 q q q的隊頭加入一個元素 x x x
實現:q[head--]=x
3.q.front(),查詢雙端隊列 q q q的隊頭。
實現:q[head+1]
4.q.back(),查詢雙端隊列 q q q的隊尾。
實現:q[tail]
5.q.pop_back(),彈出雙端隊列 q q q的隊尾。
實現:tail--
6.q.pop_front(),彈出雙端隊列 q q q的隊頭。
實現:head++
手寫的思想:兩個變量 h e a d head head t a i l tail tail,開雙倍的數組空間 N N N,將 h e a d head head t a i l tail tail都初始化為 N 2 \frac{N}{2} 2N? h e a d head head存隊頭前一個元素的下標, t a i l tail tail存隊尾的下標。
總體實現:

int q[N];
int head=N/2,tail=N/2;
void Push_back(int x){q[++tail]=x;
}
void Push_front(int x){q[head--]=x;
}
int Front(){return q[head+1];
}
int Back(){return q[tail];
}
void Pop_back(){tail--;
}
void Pop_front(){head++;
}

priority_queue

p r i o r i t y q u e u e priority_queue priorityq?ueue,優先隊列。
要拆優先隊列,首先得明白優先隊列的運行規則。
優先隊列實際上是在維護一個二叉堆
二叉堆就是一顆完全二叉樹,那么要維護這個二叉堆的什么狀態呢?
答案是維護二叉堆的每一個非葉子節點的值都大于等于(或者小于等于)它的兩個兒子的值。
那么……開拆。(大根堆)
優先隊列的常用操作:
1.q.push(x),將元素 x x x加入優先隊列 q q q
對于一個元素,從左至右依次加入二叉堆,如果父親節點有了這個兒子之后就違法了,那么它就當父親了,父親自然成了兒子。
例如向下面這個二叉堆加入一個元素 7 7 7
在這里插入圖片描述

實現:

void Push(int x){q[++cnt]=x;int p=cnt;while(p>1&&q[p/2]<q[p])swap(q[p/2],q[p]),p/=2;//維護單調性
}

2.q.top(),返回優先隊列 q q q中的最值
實現:由于時刻都在維護二叉堆的單調性,所以最值就是q[1]
3.q.pop(),彈出優先隊列 q q q的隊頭(最值)。
實現:

void Pop(){q[1]=q[cnt--];q[cnt+1]=0;int p=1;while(p<=cnt&&q[p]<max(q[p*2],q[p*2+1])){//維護//判斷左兒子和右兒子哪一個更大if(q[p*2]>q[p*2+1])swap(q[p],q[p*2]),p*=2;else swap(q[p],q[p*2+1]),p=p*2+1;}
}

思想:維護一個二叉堆。
總體實現:

int q[N];
int cnt;
void Push(int x){q[++cnt]=x;int p=cnt;while(p>1&&q[p/2]<q[p])swap(q[p/2],q[p]),p/=2;
}
int Top(){return q[1];
}
void Pop(){q[1]=q[cnt--];q[cnt+1]=0;int p=1;while(p<=cnt&&q[p]<max(q[p*2],q[p*2+1])){if(q[p*2]>q[p*2+1])swap(q[p],q[p*2]),p*=2;else swap(q[p],q[p*2+1]),p=p*2+1;}
}

stack

s t a c k stack stack,棧。
棧的基本操作:
1.t.push(x),將元素 x x x加入棧 t t t中。
實現:t[++cnt]=x
2.t.pop(),彈出棧 t t t的棧頂。
實現:cnt--
3.t.top(),查詢棧 t t t的棧頂元素。
實現:t[cnt]
4.t.empty,判斷棧 t t t是否為空。
實現:(!cnt)
5.t.size(),查詢棧 t t t的元素個數。
實現:cnt
總體實現:

int t[N];
int cnt;
void Push(int x){t[++cnt]=x;
}
void Pop(){cnt--;
}
int Top(){return t[cnt];
}
bool Empty(){return !cnt;
}
int Size(){return cnt;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/85442.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/85442.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/85442.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

6.01打卡

浙大疏錦行 DAY 40 訓練和測試的規范寫法 知識點回顧&#xff1a; 1. 彩色和灰度圖片測試和訓練的規范寫法&#xff1a;封裝在函數中 2. 展平操作&#xff1a;除第一個維度batchsize外全部展平 3. dropout操作&#xff1a;訓練階段隨機丟棄神經元&#xff0c;測試階段eval模…

CSS專題之層疊上下文

前言 石匠敲擊石頭的第 15 次 在平常開發的時候&#xff0c;有時候會遇到使用 z-index 調整元素層級沒有效果的情況&#xff0c;究其原因還是因為對層疊上下文不太了解&#xff0c;看了網上很多前輩的文章&#xff0c;決定打算寫一篇文章來梳理一下&#xff0c;如果哪里寫的有問…

RabbitMQ集群與負載均衡實戰指南

文章目錄 集群架構概述仲裁隊列的使用1. 使用Spring框架代碼創建2. 使用amqp-client創建3. 使用管理平臺創建 負載均衡引入HAProxy 負載均衡&#xff1a;使用方法1. 修改配置文件2. 聲明隊列 test_cluster3. 發送消息 集群架構 概述 RabbitMQ支持部署多個結點&#xff0c;每個…

Prometheus + Grafana + Cadvisor:構建高效企業級服務監控體系

在現代軟件開發和運維領域&#xff0c;容器化技術的應用越來越廣泛&#xff0c;其中 Docker 作為最受歡迎的容器化解決方案之一&#xff0c;其容器的監控管理變得至關重要。本文將詳細介紹如何使用 cadvisor、Prometheus 和 Grafana 來監控 Docker 容器的狀態。 一、安裝鏡像 …

小提琴圖繪制-Graph prism

在 GraphPad Prism 中為小提琴圖添加顯著性標記(如*P<0.05)的步驟如下: 步驟1:完成統計檢驗 選擇數據表:確保數據已按分組排列(如A列=Group1,B列=Group2)。執行統計檢驗: 點擊工具欄 Analyze → Column analyses → Mann-Whitney test(非參數檢驗,適用于非正態數…

【開源工具】跳過網頁APP禁止粘貼限制:自動輸入鍵盤模擬工具

&#x1f4cc; 【黑科技】跳過網頁APP禁止粘貼限制&#xff1a;自動輸入鍵盤模擬工具 &#x1f308; 個人主頁&#xff1a;創客白澤 - CSDN博客 &#x1f525; 系列專欄&#xff1a;&#x1f40d;《Python開源項目實戰》 &#x1f4a1; 熱愛不止于代碼&#xff0c;熱情源自每一…

深度學習篇---face-recognition的優劣點

face_recognition庫是一個基于 Python 的開源人臉識別工具&#xff0c;封裝了 dlib 庫的深度學習模型&#xff0c;具有易用性高、集成度強的特點。以下從技術實現、應用場景等維度分析其優劣勢&#xff1a; 一、核心優勢 1. 極簡 API 設計&#xff0c;開發效率極高 代碼量少…

Git深入解析功能邏輯與核心業務場景流程

一、Git核心功能邏輯架構 #mermaid-svg-9tj1iCr99u6QenJM {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-9tj1iCr99u6QenJM .error-icon{fill:#552222;}#mermaid-svg-9tj1iCr99u6QenJM .error-text{fill:#552222;st…

【大模型】情緒對話模型項目研發

一、使用框架&#xff1a; Qwen大模型后端Open-webui前端實現使用LLamaFactory的STF微調數據集&#xff0c;vllm后端部署&#xff0c; 二、框架安裝 下載千問大模型 安裝魔塔社區庫文件 pip install modelscope Download.py 內容 from modelscope import snapshot_downlo…

Java基礎 Day26

一、網絡編程簡介 1、概念 網絡編程指在網絡通信協議下&#xff0c;不同計算機上運行的程序&#xff0c;進行數據傳輸 2、軟件架構 &#xff08;1&#xff09;CS架構&#xff08;客戶端和服務端&#xff09; 在用戶本地有一個客戶端程序&#xff0c;在遠程有一個服務器端程…

【Hot 100】45. 跳躍游戲 II

目錄 引言跳躍游戲 IIdp解題貪心解題 &#x1f64b;?♂? 作者&#xff1a;海碼007&#x1f4dc; 專欄&#xff1a;算法專欄&#x1f4a5; 標題&#xff1a;【Hot 100】45. 跳躍游戲 II?? 寄語&#xff1a;書到用時方恨少&#xff0c;事非經過不知難&#xff01; 引言 跳躍…

計算機網絡第1章(上):網絡組成與三種交換方式全解析

目錄 一、計算機網絡的概念二、計算機網絡的組成和功能2.1 計算機網絡的組成2.2 計算機網絡的功能 三、電路交換、報文交換、分組交換3.1 電路交換&#xff08;Circuit Switching&#xff09;3.2 報文交換&#xff08;Message Switching&#xff09;3.3 分組交換&#xff08;Pa…

[總結]前端性能指標分析、性能監控與分析、Lighthouse性能評分分析

前端性能分析大全 前端性能優化 LightHouse性能評分 性能指標監控分析 瀏覽器加載資源的全過程性能指標分析 性能指標 在實現性能監控前&#xff0c;先了解Web Vitals涉及的常見的性能指標 Web Vitals 是由 Google 推出的網頁用戶體驗衡量指標體系&#xff0c;旨在幫助開發者量…

Windows商店中的免費掃雷游戲應用

《掃雷》是一款經典的單人益智小游戲&#xff0c;1992年微軟發布的Windows 3.1中加入該游戲&#xff0c;從此風靡全世界。游戲目標是通過邏輯推理&#xff0c;在最短的時間內根據點擊格子出現的數字找出所有非雷格子&#xff0c;同時避免踩雷。 此Windows應用實現了經典掃雷的…

ActiveMQ 可觀測性最佳實踐

ActiveMQ 介紹 ActiveMQ 是一款高性能、開源的消息中間件&#xff0c;支持多種消息協議&#xff08;如 JMS、AMQP、MQTT 等&#xff09;&#xff0c;能夠實現應用程序之間的異步通信和消息傳遞。它提供點對點&#xff08;Queue&#xff09;和發布/訂閱&#xff08;Topic&#…

【Linux命令】scp遠程拷貝

文章目錄 1. 基本語法與常用選項2. 使用場景和使用示例本地文件->遠程主機遠程主機文件->本地遠程主機->另一臺遠程主機 3. 使用注意事項 scp&#xff08;Secure Copy Protocol&#xff09;是linux中基于ssh的安全文件傳輸工具&#xff0c;用于在本地和遠程主機之前安…

如何優化 Harmony-Cordova 應用的性能?

以下是針對 ?Harmony-Cordova 應用性能優化?的完整方案&#xff0c;結合鴻蒙原生特性和Cordova框架優化策略&#xff1a; ??一、渲染性能優化? ?減少布局嵌套層級? 使用扁平化布局&#xff08;如 Grid、GridRow&#xff09;替代多層 Column/Row 嵌套&#xff0c;避免冗…

c++學習之---模版

目錄 一、函數模板&#xff1a; 1、基本定義格式&#xff1a; 2、模版函數的優先匹配原則&#xff1a; 二、類模板&#xff1a; 1、基本定義格式&#xff1a; 2、類模版的優先匹配原則&#xff08;有坑哦&#xff09;&#xff1a; 3、缺省值的設置&#xff1a; 4、ty…

SpringAI(GA):RAG下的ETL快速上手

原文鏈接&#xff1a;SpringAI(GA)&#xff1a;RAG下的ETL快速上手 教程說明 說明&#xff1a;本教程將采用2025年5月20日正式的GA版&#xff0c;給出如下內容 核心功能模塊的快速上手教程核心功能模塊的源碼級解讀Spring ai alibaba增強的快速上手教程 源碼級解讀 版本&a…

用dayjs解析時間戳,我被提了bug

引言 前幾天開發中突然接到測試提的一個 Bug&#xff0c;說我的時間組件顯示異常。 我很詫異&#xff0c;這里初始化數據是后端返回的&#xff0c;我什么也沒改&#xff0c;這bug提給我干啥。我去問后端&#xff1a;“這數據是不是有問題&#xff1f;”。后端答&#xff1a;“…