【C++】Stack and Queue and Functor

本文是小編鞏固自身而作,如有錯誤,歡迎指出!

本次我們介紹STL中的stack和queue和其相關的一些容器和仿函數

一.stack and queue

1.適配器

stack和queue其實不是真正意義上的容器,而是容器適配器,而容器適配器又是什么呢?

在C++中,容器適配器(Container Adapters)是一種特殊的容器,它們不提供獨立的底層數據存儲結構,而是基于其他基礎容器(如 vector、deque、list)來實現特定的功能和接口。

簡單來說就是之前我們學習的時要了解stack和queue的底層是什么,是數組還是隊列,同理在c++就考慮他的底層是vector還是list等等

而在官方給的底層是deque

?而deque又是什么呢?

2.deque

全稱為“double-ended queue”,即雙端隊列,是 C++ 標準模板庫(STL)中的一種容器。

簡單來說deque就是vector和list的縫合產物

通過前面的學習我們都知道,vector的尾插時間復雜度比頭插小,而list痛點在于不能隨機訪問,但deque就解決了這個問題

deque 是一種序列容器,它允許在容器的兩端快速插入和刪除元素,時間復雜度為 O(1)。與 vector 相比,deque 可以在頭部和尾部高效地進行元素的插入和刪除操作;與 list 相比,deque 支持隨機訪問元素。

deque的原理類似下圖?

?deque本質其實就是劃分一個個個小數組融合成為大數組,其由一個中控數組map操作,而map中儲存的就是每個小數組的地址,及其頭尾指針等等。

下面是用vector實現的棧和用list實現的隊列

#include<vector>
namespace bite
{template<class T>class stack{public:stack() {}void push(const T& x) {_c.push_back(x);}
void pop() {_c.pop_back();}T& top() {return _c.back();}const T& top()const {return _c.back();}size_t size()const {return _c.size();}bool empty()const {return _c.empty();}private:std::vector<T> _c;};
}
#include <list>
namespace bite
{template<class T>class queue{public:queue() {}void push(const T& x) {_c.push_back(x);}void pop() {_c.pop_front();}T& back() {return _c.back();}const T& back()const {return _c.back();}T& front() {return _c.front();}const T& front()const {return _c.front();}size_t size()const {return _c.size();}bool empty()const {return _c.empty();}private:std::list<T> _c;};
}

?

二.priority_queue

1.priority_queue簡介

在 C++ 中,priority_queue(優先隊列) 是一種特殊的容器適配器,它基于堆(Heap)數據結構實現,提供常數時間訪問最大/最小元素的能力(默認最大堆)。

我們看下以下用例

#include<iostream>
#include<queue>
using namespace std;
int main()
{priority_queue<int> pq;pq.push(3);pq.push(5);pq.push(6);pq.push(1);pq.push(9);while (!pq.empty()){cout << pq.top();pq.pop();}return 0;}

?我們看出來這是系統默認的情況(最大堆),那么如果我們自己實現要自己模擬實現想要最小堆建怎么辦呢?

我們先看看模擬實現是什么樣的

#pragma once
#include<vector>
template<class T>
class Less
{
public:bool operator()(const T& x,const T& y){return x < y;}};
template<class T>
class Greater
{
public:bool operator()(const T& x, const T& y){return x > y;}
};
namespace yiming
{template<class T,class Container=std::vector<T>,class Compare=Less<T>>class priority_queue{public:priority_queue() = default;template <class InputIterator>priority_queue(InputIterator first, InputIterator last):con(first,last){//向下調整建堆for (int i = (con.size() - 1 - 1) / 2;i >= 0;i--){adjust_down(i);}}void push(const T& x){con.push_back(x);adjust_up(con.size() - 1);}void pop(){swap(con[0], con[con.size() - 1]);con.pop_back();adjust_down(0);}const T& top(){return con[0];}bool empty()const{return con.empty();}size_t size()const{return con.size();}private:void adjust_up(int child)//向上調整{Compare com;int parent = (child - 1) / 2;while (child > 0){if (com(con[parent], con[child])){swap(con[child], con[parent]);child = parent;parent = (child - 1) / 2;}else{break;}}}void adjust_down(int parent){Compare com;size_t child = parent * 2 + 1;while (child < con.size()){if (child + 1 < con.size() && com(con[child], con[child + 1]))//選出最大的child++child;if (com(con[parent], con[child])){swap(con[parent], con[child]);parent = child;child = parent * 2 + 1;}else{break;}}}private:Container con;};
}

其中我們看到了主要決定這個模擬實現的類型就行這樣一個模版

   template<class T,class Container=std::vector<T>,class Compare=Less<T>>

?我們看到通過這個模版的Compare就可以實現建大堆小堆,這里就涉及到一個概念,仿函數

2.仿函數

仿函數(Functor)是C++中一種行為類似函數的對象,通過重載operator()實現。它可以是普通函數指針、類成員函數指針或定義了operator()的類對象。

其實簡單來說就是把一個類包裝成函數的樣子

如上述代碼中的

template<class T>
class Less
{
public:bool operator()(const T& x,const T& y){return x < y;}};
template<class T>
class Greater
{
public:bool operator()(const T& x, const T& y){return x > y;}
};

這樣就可以通過模版來實現改變建大堆小堆了

三.測試代碼

int main()
{
priority_queue <int>pq;pq.push(4);pq.push(5);pq.push(2);pq.push(5);pq.push(6);while (!pq.empty()){cout << pq.top() << " ";pq.pop();}cout << endl;stack<int> st;st.push(1);st.push(3);st.push(4);while (!st.empty()){cout << st.top() << " ";st.pop();}cout << endl;queue<int>q;q.push(1);q.push(2);q.push(3);q.push(4);while (!q.empty()){cout << q.front()<<" ";q.pop();}return 0;
}

本次分享就到這里結束了,后續會繼續更新,感謝閱讀!

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

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

相關文章

Python爬蟲實戰:研究OpenCV技術構建圖像數據處理系統

1. 引言 1.1 研究背景 在當今數字化時代,圖像作為一種重要的信息載體,廣泛存在于各類網站、社交媒體和在線平臺中。這些圖像數據涵蓋了從自然風光、人物肖像到商品展示、新聞事件等豐富內容,為數據分析和模式識別提供了寶貴的資源。隨著計算機視覺技術的快速發展,對大規模…

電感矩陣-信號完整性分析

電感矩陣:正如電容矩陣用于存儲許多信號路徑和返回路徑的所有電容量&#xff0c;我們也需要一個矩陣存儲許多導線的回路自感和回路互感值。需要牢記的是&#xff0c;這里的電感元件是回路電感。當信號沿傳輸線傳播時&#xff0c;電流回路沿信號路徑傳輸&#xff0c;然后立即從返…

JUC相關知識點總結

Java JUC&#xff08;java.util.concurrent&#xff09;是Java并發編程的核心工具包&#xff0c;提供了豐富的并發工具類和框架。以下是JUC的主要知識點&#xff0c;按難易程度分類&#xff0c;供你參考&#xff1a; 1. 基礎概念與工具類 1.1 并發與并行&#xff08;易&#x…

激光頻率梳 3D 測量方案革新:攻克光學掃描遮擋,130mm 深孔測量精度達 2um

一、深孔測量的光學遮擋難題在精密制造領域&#xff0c;130mm 級深孔&#xff08;如航空發動機燃油孔、模具冷卻孔&#xff09;的 3D 測量長期受困于光學遮擋。傳統激光掃描技術依賴直射光束&#xff0c;當深徑比超過 10:1 時&#xff0c;孔壁中下部形成大量掃描盲區&#xff0…

clickhouse 中文數據的正則匹配

中文數據的正則匹配 在ClickHouse中,正則匹配通常用于數據的篩選、格式化等操作。以下是一些常用的正則匹配技巧: 1. 匹配中文字符 要匹配中文字符,可以使用以下正則表達式: SELECT * FROM my_table WHERE my_column REGEXP [\\x{4e00}-\\x{9fa5}];這里的 \\x{4e00}-\\…

[驅動開發篇] Can通信進階 --- CanFD 的三次采樣

驅動開發篇] Can通信進階 --- Can報文的三次采樣一、CAN FD的采樣次數1.1. 標準規定1.2. 傳統標準CAN采樣1.3. CAN FD的采樣策略1.3.1. 基礎采樣策略1.4. 配置位置1.5. 常見步驟二、CAN FD與標準CAN在采樣機制上的主要區別三、使用建議四. 芯片廠商實現4.1. 實際市面情況4.2. 例…

分布式文件系統06-分布式中間件彈性擴容與rebalance沖平衡

分布式中間件彈性擴容與rebalance沖平衡176_如果宕機的數據節點事后再次重啟會發生什么事情&#xff1f;某個之前某個宕機的數據節點DataNode-A又重啟后&#xff0c;肯定會再次注冊&#xff0c;并進行全量上報的流程&#xff0c;此時&#xff0c;就會導致DataNode-A上的文件副本…

芯祥科技:工業/車規級BMS芯片廠商 規格選型對比

芯祥科技公司專注于工業和車規級BMS芯片&#xff0c;電源芯片及可編程模擬芯片的研發與銷售&#xff0c;客戶遍及新能源儲能&#xff0c;汽車&#xff0c;電腦&#xff0c;服務器及電動工具等領域。并具有創業公司成功經驗&#xff0c;平均具有逾17年以上的芯片研發和市場銷售經…

莫隊基礎(Mo‘s algorithm)

莫隊算法簡介 莫隊算法是一種用于高效處理離線區間查詢問題的算法&#xff0c;由莫濤&#xff08;Mo Tao&#xff09;在2009年提出。其核心思想是通過對查詢區間進行分塊和排序&#xff0c;利用前一次查詢的結果來減少計算量&#xff0c;從而將時間復雜度優化至接近線性。 莫…

板卡兩個ADC,一個JESD204b sync正常,另一個JESD204B同步不上的問題

目錄 1.問題來源: 2.問題分析 進一步測試表現: 抓取204B高速鏈路數據如上所示。 說明不是配置流程的問題 1.問題來源: 在工控機上和部分電腦上面出現時鐘鎖不住的現象,無法正常使用板卡。 經過分析,發現板卡上有兩片ADC,其中一片的ADC的sync信號經過測量,是正常的,…

Android10 系統休眠調試相關

Android10 系統休眠調試相關實時打印休眠日志(實測好像沒作用)&#xff1a;echo 1 > /sys/module/printk/parameters/console_suspend查看喚醒鎖&#xff1a;cat sys/power/wake_lock msm8953_64:/ # cat sys/power/wake_lock PowerManager.SuspendLockout PowerManagerServ…

一文掌握Bard機器翻譯,以及用python調用的4種方式(現已升級為 Gemini)

文章目錄一、Bard機器翻譯概述1.1. Bard機器翻譯介紹1.2 Bard機器翻譯的核心特點1.3 技術背景1.4 與同類模型對比二、Bard機器翻譯案例2.1 官方 REST API&#xff08;推薦生產&#xff09;2.2 通過Google Cloud API調用2.3 私有化部署方案2.4 開源鏡像 PyBard&#xff08;無需 …

Kafka-Eagle 安裝

Kafka-Eagle官網 1&#xff09;上傳壓縮包 kafka-eagle-bin-2.0.8.tar.gz 到集群第一臺的/opt/modules 目錄 2&#xff09;解壓到本地 tar -zxvf kafka-eagle-bin-2.0.8.tar.gz 3&#xff09;將 efak-web-2.0.8-bin.tar.gz 解壓至/opt/installs cd kafka-eagle-bin-2.0.8 …

接口請求的后臺發起確認

場景講解做業務開發時經常遇到這些場景&#xff0c;在后端代碼執行命中了些業務規則&#xff0c;需要前端用戶確認一下再往下執行。示例1&#xff1a;后端判斷申請1筆超過5萬的資金時會發起監管流程&#xff0c;告訴前端操作用戶風險并詢問是否確認執行。示例2&#xff1a;數據…

完整學習MySQL

DML 等術語概念 DML&#xff08;Data Manipulation Language&#xff0c;數據操縱語言&#xff09;&#xff1a; DML主要用于插入、更新、刪除和查詢數據庫中的數據。常見的DML語句包括&#xff1a; INSERT&#xff1a;用于向表中插入新的數據行。UPDATE&#xff1a;用于修改…

大模型筆記1——李宏毅《2025機器學習》第一講

本篇筆記內容1、學習本節課需要的前置知識了解大模型的訓練過程&#xff1a;預訓練、后訓練、強化學習&#xff08;2024年生成式AI導論前8講&#xff09;了解基礎機器學習、深度學習概念&#xff08;如transformer&#xff09;&#xff08;2021年機器學習課程&#xff09;2、本…

CSS scrollbar-width:輕松定制滾動條寬度的隱藏屬性

在前端設計中&#xff0c;滾動條往往是一個容易被忽略的細節。默認的滾動條樣式常常與頁面設計格格不入&#xff0c;尤其是寬度 —— 過寬的滾動條會擠占內容空間&#xff0c;過窄又可能影響用戶操作。而 CSS 的scrollbar-width屬性&#xff0c;就像一把 “精細的尺子”&#x…

小迪23年-28~31-js簡單回顧

前端-js開發 課堂完結后欲復習鞏固也方便后續-重游-故寫此篇 從實現功能過渡到涉及的相關知識點 知識點 1、 JS 是前端語言&#xff0c;是可以被瀏覽器“看到”的&#xff0c;當然也可以被修改啊&#xff0c;被瀏覽器禁用網頁的 JS 功能啊之類的。所以一般都是前后端分離開發&…

JavaScript 概述

JavaScript 是一種高級、解釋型編程語言&#xff0c;主要用于網頁開發&#xff0c;使其具備動態交互功能。它是網頁三大核心技術之一&#xff08;HTML、CSS、JavaScript&#xff09;&#xff0c;能夠直接嵌入 HTML 頁面并在瀏覽器中執行。核心特性動態弱類型語言 JavaScript 是…

Mermaid流程圖可視化系統:基于Spring Boot與Node.js的三層架構實現

什么是Mermaid?系統架構設計 三層架構 overview架構交互流程 核心組件詳解 1. Spring Boot后端2. Node.js中間層3. 前端界面 功能實現 1. 節點和關系管理2. 流程圖渲染3. 主題切換4. 導出功能 使用指南 啟動步驟頁面操作 總結與展望 什么是Mermaid? Mermaid流程圖可視化系統…