C++初階——簡單實現stack和queue

目錄

1、Deque(了解)

1.1 起源

1.2 結構

1.3 優缺點

1.4 應用

2、Stack

3、Queue

4、Priority_Queue


注意:stack,queue,priority_queue是容器適配器(container adaptor) ,封裝一個容器,按照某種規則使用,一般不實現迭代器。

1、Deque(了解)

1.1 起源

vector和list優缺點,挺互補的,能不能實現一個容器,都具備他們的優點,就這樣,deque誕生了,但是從現在來看,deque,并不算成功?。

1.2 結構

中控數組(map),是一個指針數組,指針指向一個buffer數組的地址,通過迭代器遍歷。

細節:

1. map中的指針,一開始放在中間位置,方便頭插數據。

2. 使用兩個迭代器,start,finish。

3. 通過,取模,除,找到是在第幾個buffer數組的第幾個位置。

1.3 優缺點

優點:

1. 頭插尾插效率高。

2. 隨機下標訪問也不錯。

缺點:

3. 中部位置插入刪除,需挪動數據,效率低。

4. 遍歷數據,需頻繁檢查,效率低。

1.4 應用

STL中對stack和queue默認選擇deque作為其底層容器,主要是因為:

1. stack和queue不需要遍歷(因此stack和queue沒有迭代器),只需要在固定的一端或者兩端進行操作

2. 在stack中元素增長時,deque比vector的效率高(擴容時不需要搬移大量數據);

? ? 在queue中元素增長時,deque不僅效率高,而且內存使用率高。(一次開更多的空間,只存數據,不存節點)

2、Stack

#pragma once
#include <deque>using namespace std;namespace Lzc
{template<class T, class Container = deque<T>>class stack{public:void push(const T& val){_con.push_back(val);}void pop(){_con.pop_back();}const T& top() const{return _con.back();}size_t size() const{return _con.size();}bool empty() const{return _con.empty();}private:Container _con;};
}

3、Queue

#pragma once
#include <deque>using namespace std;namespace Lzc
{template<class T,class Container = deque<T>>class queue{public:void push(const T& val){_con.push_back(val);}void pop(){_con.pop_front();}const T& front() const{return _con.front();}const T& back() const{return _con.back();}size_t size() const{return _con.size();}bool empty() const{return _con.empty();}private:Container _con;};
}

4、Priority_Queue

容器適配器,封裝vector,采用堆的結構。堆+堆排序+topK問題_大頂堆小頂堆java-CSDN博客

先介紹一下仿函數:本質是一個類,這個類重載operator(),他的對象可以像函數一樣使用。

如:Less le;? ? le.operator()(x,y) 等價于?le(x,y);

#include <algorithm>
#include <vector>using namespace std;// less(<) 升序
// greater(>) 降序
template<class T>
struct Less
{bool operator()(const T& x, const T& y){return x < y;}
};template<class T>
struct Greater
{bool operator()(const T& x, const T& y){return x > y;}
};int main()
{vector<int> v = {3,2,4,5,1,6,7,8,9};// void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);sort(v.begin(),v.end(),Less<int>()); // 升序 函數模板,傳對象(匿名對象)sort(v.begin(),v.end(),Greater<int>()); // 降序return 0;
}

std::priority_queue,默認less,建大堆。

#pragma once
#include <vector>using namespace std;namespace Lzc
{template<class T, class Container = vector<T>, class Compare = less<T>> // 使用std中的less<T>和greater<T>class priority_queue{public:void AdjustUp(size_t child)//建大堆,child為插入元素的下標{size_t parent = (child - 1) / 2;Compare com;while (child > 0){//if (_con[parent] < _con[child])if (com(_con[parent], _con[child])) //建大堆{swap(_con[parent], _con[child]);child = parent;parent = (parent - 1) / 2;}elsebreak;//沒有交換,則就是在這個位置}}void AdjustDown(size_t parent)//建大堆,n為a的元素個數,parent為要向下調整的元素下標{size_t child = 2 * parent + 1;Compare com;while (child < size()){//if (_con[child] < _con[child + 1] && child + 1 < n) // 假設法,建大堆if (com(_con[child], _con[child + 1] && child + 1 < size()))child++;// if (_con[parent] < _con[child]) // 建大堆if (com(_con[parent], _con[child])){swap(_con[parent], _con[child]);parent = child;child = 2 * child + 1;}elsebreak;}}void push(const T& val){_con.push_back(val);AdjustUp(size() - 1);}void pop(){swap(_con[0], _con[size() - 1]);_con.pop_back();AdjustDown(0);}const T& top() const{return _con.front();}size_t size() const{return _con.size();}bool empty() const{return _con.empty();}private:Container _con;};
}

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

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

相關文章

第2課 樹莓派鏡像的燒錄

樹莓派的系統通常是安裝在SD卡上的?。SD卡作為啟動設備,負責啟動樹莓派并加載操作系統。這種設計使得樹莓派具有便攜性和靈活性,用戶可以通過更換SD卡來更換操作系統或恢復出廠設置。 燒錄樹莓派的鏡像即是將樹莓派鏡像燒錄到SD卡上,在此期間會格式化SD卡,如果SD卡…

【Unity】URP管線Shader編程實例詳解 (1) : 漩渦效果shader

作者說 本系列教程適用于有編程基礎和圖形學基礎知識的讀者.如果對您有所幫助&#xff0c;請點個免費的贊和關注&#xff0c;您的支持就是我更新最大的動力&#xff01;如果你有任何想看的內容歡迎評論區留言&#xff01;本系列教程Github : https://github.com/Sky0Master/Un…

如何安裝vm 和centos

安裝 VMware Workstation&#xff08;以 Windows 系統為例&#xff09; 1. 下載 VMware Workstation 打開 VMware 官方網站&#xff08;Desktop Hypervisor Solutions | VMware &#xff09;&#xff0c;在頁面中選擇適合你系統的版本進行下載。如果你是個人非商業使用&#x…

STM32-心知天氣項目

一、項目需求 使用 ESP8266 通過 HTTP 獲取天氣數據&#xff08;心知天氣&#xff09;&#xff0c;并顯示在 OLED 屏幕上。 按鍵 1 &#xff1a;循環切換今天 / 明天 / 后天天氣數據&#xff1b; 按鍵 2 &#xff1a;更新天氣。 二、項目框圖 三、cjson作用 https://gi…

Wireshark簡單教程

1.打開Wireshark,點擊最上面欄目里面的“捕獲”中的“選項” 2.進入網卡選擇界面,選擇需要捕獲的選擇&#xff0c;這里我選擇WLAN 3.雙擊捕獲選擇出現下面界面 4.點擊如下圖紅方框即可停止捕獲 5.點擊下圖放大鏡可以進行放大 6.你也可以查詢tcp報文如下圖

【Http和Https區別】

概念&#xff1a; 一、Http協議 HTTP&#xff08;超文本傳輸協議&#xff09;是一種用于傳輸超媒體文檔&#xff08;如HTML&#xff09;的應用層協議&#xff0c;主要用于Web瀏覽器和服務器之間的通信。http也是客戶端和服務器之間請求與響應的標準協議&#xff0c;客戶端通常…

Unity Shader 學習13:屏幕后處理 - 使用高斯模糊的Bloom輝光效果

目錄 一、基本的后處理流程 - 以將畫面轉化為灰度圖為例 1. C#調用shader 2. Shader實現效果 二、Bloom輝光效果 1. 主要變量 2. Shader效果 &#xff08;1&#xff09;提取較亮區域 - pass1 &#xff08;2&#xff09;高斯模糊 - pass2&3 &#xff08;3&#xff…

【R語言】dplyr包經典函數summarise函數

dplyr包經典函數summarise函數&#xff0c;后面改名乘reframe函數了&#xff0c;但是summarise仍然適用 這個函數的返回結果是一個新的數據框&#xff0c;下面講一下幾種常見用法 示例數據為R自帶的數據集mtcars 1.不分組 mtcars %>%summarise(mean mean(disp), n n()…

使用DeepSeek/ChatGPT等AI工具輔助編寫wireshark過濾器

隨著deepseek,chatgpt等大模型的能力越來越強大&#xff0c;本文將介紹借助deepseek&#xff0c;chatgpt等大模型工具&#xff0c;通過編寫提示詞&#xff0c;輔助生成全面的Wireshark顯示過濾器的能力。 每一種協議的字段眾多&#xff0c;流量分析的需求多種多樣&#xff0c;…

vscode設置自動換行

vscode設置自動換行 方法 方法 點擊文件->首選項->設置。搜索word wrap -> 選擇 on 。 搜索Word Wrap&#xff0c;并把選項改為on。

QT 中的元對象系統(一):元對象和元數據

目錄 1.為什么需要元系統 2.元數據 3.模擬元對象系統 3.1.元對象聲明 3.2.對C擴展 3.3初始化元對象 3.4.使用元對象 4.QT的元系統 4.1.元對象系統基于QObject類、Q_OBJECT宏、元對象編譯器MOC實現 4.2.元對象系統的功能 4.3.Q_PROPERTY()的使用 4.4.Q_INVOKABLE使用…

Pytorch實現之渾濁水下圖像增強

簡介 簡介:這也是一篇非常適合GAN小白們上手的架構文章!提出了一種基于GAN的水下圖像增強網絡。這種網絡與其他架構類似,生成器是卷積+激活函數+歸一化+殘差結構的組成,鑒別器是卷積+激活函數+歸一化以及全連接層。損失函數是常用的均方誤差、感知損失和對抗損失三部分。 …

TCPDF 任意文件讀取漏洞:隱藏在 PDF 生成背后的危險

在網絡安全的世界里&#xff0c;漏洞就像隱藏在黑暗中的“定時炸彈”&#xff0c;稍有不慎就會引發災難性的后果。今天&#xff0c;我們要聊的是一個與 PDF 生成相關的漏洞——TCPDF 任意文件讀取漏洞。這個漏洞可能讓攻擊者輕松讀取服務器上的敏感文件&#xff0c;甚至獲取整個…

【Git】六、企業級開發模型

文章目錄 Ⅰ. 前言Ⅱ. 系統開發環境Ⅲ. Git 分支設計規范master分支release分支develop分支feature分支hotfix分支 Ⅰ. 前言 ? 我們知道&#xff0c;一個軟件從零開始到最終交付&#xff0c;大概包括以下幾個階段&#xff1a;規劃、編碼、構建、測試、發布、部署和維護。 ?…

Kafka可視化工具EFAK(Kafka-eagle)安裝部署

Kafka Eagle是什么&#xff1f; Kafka Eagle是一款用于監控和管理Apache Kafka的開源系統&#xff0c;它提供了完善的管理頁面&#xff0c;例如Broker詳情、性能指標趨勢、Topic集合、消費者信息等。 源代碼地址&#xff1a;https://github.com/smartloli/kafka-eagle 前置條件…

C++:dfs,bfs各兩則

1.木棒 167. 木棒 - AcWing題庫 喬治拿來一組等長的木棒&#xff0c;將它們隨機地砍斷&#xff0c;使得每一節木棍的長度都不超過 5050 個長度單位。 然后他又想把這些木棍恢復到為裁截前的狀態&#xff0c;但忘記了初始時有多少木棒以及木棒的初始長度。 請你設計一個程序…

電子商務網站租用香港服務器的好處有哪些?

電子商務網站租用香港服務器的好處主要包括&#xff1a; 香港服務器提供高速的網絡連接&#xff0c;國內訪問速度優勢明顯&#xff0c;滿足企業內部數據傳輸和遠程辦公需求。擁有國際出口帶寬優勢&#xff0c;實現與全球各地的高速連接&#xff0c;對跨國業務和海外市場拓展至關…

stm32108鍵C-B全調性_動態可視化樂譜鋼琴

108鍵全調性鋼琴 一 基本介紹1 項目簡介2 實現方式3 項目構成 二 實現過程0 前置基本外設驅動1 聲音控制2 樂譜錄入&基礎樂理3 點陣屏譜點動態刷新4 項目交互控制5 錄入新曲子過程 三 展示&#xff0c;與鏈接視頻地址1 主要功能函數一覽2 下載鏈接3 視頻效果 一 基本介紹 …

【p-camera-h5】 一款開箱即用的H5相機插件,支持拍照、錄像、動態水印與樣式高度定制化。

【開源推薦】p-camera-h5&#xff1a;一款輕量級H5相機插件開發實踐 一、插件背景 在Web開發中&#xff0c;原生攝像頭功能的集成往往面臨以下痛點&#xff1a; 瀏覽器兼容性問題視頻流與水印疊加實現復雜移動端適配困難功能定制成本高 為此&#xff0c;p-camera-h5 —— 一…

交叉編譯curl(OpenSSL)移植ARM詳細步驟

運行配置腳本 使用 Configure 腳本配置 OpenSSL&#xff0c;指定目標平臺和安裝路徑&#xff1a; curl downloads 各個版本 Old 1.1.1 Releases | OpenSSL Library 各個版本 從 OpenSSL 官網下載源碼包 tar -xzf openssl-1.1.1b.tar.gz cd openssl-1.1.1b/運行配置腳本 使…