C++ -- STL-- stack and queue

? ? ? ?////// ? ? 歡迎來到 aramae 的博客,愿 Bug 遠離,好運常伴! ?//////

博主的Gitee地址:阿拉美 (aramae) - Gitee.com

時代不會辜負長期主義者,愿每一個努力的人都能達到理想的彼岸。

  • 1. stack的介紹和使用
  • 2. queue的介紹和使用
  • 3. priority_queue的介紹和使用
  • 4. 容器適配器
引言: 本章介紹 STL的 stack 和 queue 容器的使用,priority_queue的介紹和使用。簡單介紹適配器相關內容。

1. stack的介紹和使用

1.1 stack的介紹

1. stack是一種容器適配器,專門用在具有后進先出操作的上下文環境中,其刪除只能從容器的一端進行 元素的插入與提取操作。

2.stack是作為容器適配器被實現的,容器適配器即是對特定類封裝作為其底層的容器,并提供一組特定 的成員函數來訪問其元素,將特定類作為其底層的,元素特定容器的尾部(即棧頂)被壓入和彈出。

3. stack的底層容器可以是任何標準的容器類模板或者一些其他特定的容器類,這些容器類應該支持以下 操作:

  • empty:判空操作
  • back:獲取尾部元素操作
  • push_back:尾部插入元素操作
  • pop_back:尾部刪除元素操作

4.標準容器vector、deque、list均符合這些需求,默認情況下,如果沒有為stack指定特定的底層容器,默認情況下使用deque。?

stack文檔介紹:https://cplusplus.com/reference/stack/stack/?kw=stack?

1.2 stack的使用?

?簡單代碼演示:

#include <iostream>
// 包含 stack 相關頭文件
#include <stack> 
using namespace std;int main() {// stack():構造空的棧,這里存儲 int 類型元素stack<int> stk; // empty():檢測 stack 是否為空,剛開始棧空,輸出 1(true)cout << "棧是否為空:" << stk.empty() << endl; // push():將元素壓入 stack 中,依次壓入 10、20、30stk.push(10); stk.push(20);stk.push(30);// size():返回 stack 中元素的個數,此時有 3 個元素,輸出 3cout << "棧中元素個數:" << stk.size() << endl; // top():返回棧頂元素的引用,棧頂是 30,輸出 30cout << "棧頂元素:" << stk.top() << endl; // pop():將 stack 中尾部(棧頂)的元素彈出,彈出 30 后,棧里剩下 10、20stk.pop(); // 再次查看棧頂,變為 20,輸出 20cout << "彈出后棧頂元素:" << stk.top() << endl; return 0;
}

1.3 stack的模擬實現

從棧的接口中可以看出,棧實際是一種特殊的vector,因此使用vector完全可以模擬實現stack。
#include <iostream>
#include <vector>
// 用于異常處理
#include <stdexcept> 
using namespace std;template <typename T>
class MyStack {
private:// 使用 vector 作為底層容器存儲數據vector<T> data;public:// 構造函數,創建一個空棧MyStack() {}// 判斷棧是否為空bool empty() const {return data.empty();}// 獲取棧中元素的個數size_t size() const {return data.size();}// 入棧操作,將元素壓入棧頂void push(const T& value) {data.push_back(value);}// 出棧操作,刪除并返回棧頂元素T pop() {if (empty()) {// 如果棧為空,拋出異常throw out_of_range("Stack is empty, can't pop element.");}T topElement = data.back();data.pop_back();return topElement;}// 獲取棧頂元素(不刪除)T& top() {if (empty()) {// 如果棧為空,拋出異常throw out_of_range("Stack is empty, can't get top element.");}return data.back();}//  const 版本的 top,用于 const 對象獲取棧頂元素(不刪除)const T& top() const {if (empty()) {throw out_of_range("Stack is empty, can't get top element.");}return data.back();}
};// 測試函數
void testStack() {MyStack<int> stack;// 入棧stack.push(10);stack.push(20);stack.push(30);cout << "Stack size: " << stack.size() << endl;cout << "Top element: " << stack.top() << endl;// 出棧int popped = stack.pop();cout << "Popped element: " << popped << endl;cout << "Now top element: " << stack.top() << endl;cout << "Is stack empty? " << (stack.empty() ? "Yes" : "No") << endl;
}int main() {testStack();return 0;
}


2. queue的介紹和使用

2.1 queue的介紹

1. 隊列是一種容器適配器,專門用于在FIFO上下文(先進先出)中操作,其中從容器一端插入元素,另一端提取元素。
2. 隊列作為容器適配器實現,容器適配器即將特定容器類封裝作為其底層容器類,queue提供一組特定的成員函數來訪問其元素。元素從隊尾入隊列,從隊頭出隊列。
3. 底層容器可以是標準容器類模板之一,也可以是其他專門設計的容器類。該底層容器應至少支持以下操作:
  • empty:檢測隊列是否為空
  • size:返回隊列中有效元素的個數
  • front:返回隊頭元素的引用
  • back:返回隊尾元素的引用
  • push_back:在隊列尾部入隊列
  • pop_front:在隊列頭部出隊列
4. 標準容器類deque和list滿足了這些要求。默認情況下,如果沒有為queue實例化指定容器類,則使用標準容器deque。

queue文檔介紹:?https://cplusplus.com/reference/queue/queue/

2.2 queue的使用?

簡單代碼演示:

#include <iostream>
// 包含 queue 容器的頭文件
#include <queue> 
using namespace std;int main() {// queue():構造空的隊列,這里隊列存儲 int 類型數據queue<int> q; // empty():檢測隊列是否為空,剛開始隊列為空,輸出 trueif (q.empty()) { cout << "隊列初始為空" << endl;}// push():在隊尾將元素入隊列,依次把 10、20、30 入隊q.push(10); q.push(20); q.push(30); // size():返回隊列中有效元素的個數,此時隊列有 3 個元素,輸出 3cout << "隊列中元素個數:" << q.size() << endl; // front():返回隊頭元素的引用,隊頭是 10,輸出 10cout << "隊頭元素:" << q.front() << endl; // back():返回隊尾元素的引用,隊尾是 30,輸出 30cout << "隊尾元素:" << q.back() << endl; // pop():將隊頭元素出隊列,執行后隊頭元素 10 被移除,隊列剩下 20、30q.pop(); // 再次查看隊頭,變為 20,輸出 20cout << "執行 pop 后,新的隊頭元素:" << q.front() << endl; return 0;
}

2.3 queue的模擬實現

因為queue的接口中存在頭刪和尾插,因此使用vector來封裝效率太低,故可以借助list來模擬實現queue,具體如下
#include <iostream>
#include <list>
#include <stdexcept>  // 用于異常處理
using namespace std;template <typename T>
class MyQueue {
private:// 使用 list 作為底層容器存儲數據list<T> data;public:// 構造函數,創建一個空隊列MyQueue() {}// 判斷隊列是否為空bool empty() const {return data.empty();}// 獲取隊列中元素的個數size_t size() const {return data.size();}// 入隊操作,將元素添加到隊尾void push(const T& value) {data.push_back(value);}// 出隊操作,刪除并返回隊首元素T pop() {if (empty()) {// 如果隊列為空,拋出異常throw out_of_range("Queue is empty, can't pop element.");}T frontElement = data.front();data.pop_front();return frontElement;}// 獲取隊首元素(不刪除)T& front() {if (empty()) {// 如果隊列為空,拋出異常throw out_of_range("Queue is empty, can't get front element.");}return data.front();}// const 版本的 front,用于 const 對象獲取隊首元素(不刪除)const T& front() const {if (empty()) {throw out_of_range("Queue is empty, can't get front element.");}return data.front();}// 獲取隊尾元素(不刪除)T& back() {if (empty()) {// 如果隊列為空,拋出異常throw out_of_range("Queue is empty, can't get back element.");}return data.back();}// const 版本的 back,用于 const 對象獲取隊尾元素(不刪除)const T& back() const {if (empty()) {throw out_of_range("Queue is empty, can't get back element.");}return data.back();}
};// 測試函數
void testQueue() {MyQueue<int> queue;// 入隊queue.push(10);queue.push(20);queue.push(30);cout << "Queue size: " << queue.size() << endl;cout << "Front element: " << queue.front() << endl;cout << "Back element: " << queue.back() << endl;// 出隊int dequeued = queue.pop();cout << "Dequeued element: " << dequeued << endl;cout << "Now front element: " << queue.front() << endl;cout << "Is queue empty? " << (queue.empty() ? "Yes" : "No") << endl;
}int main() {testQueue();return 0;
}


3. priority_queue的介紹和使用

3.1 priority_queue的介紹

1. 優先隊列是一種容器適配器,根據嚴格的弱排序標準,它的第一個元素總是它所包含的元素中最大的。
2. 此上下文類似于堆,在堆中可以隨時插入元素,并且只能檢索最大堆元素(優先隊列中位于頂部的元素)。
3. 優先隊列被實現為容器適配器,容器適配器即將特定容器類封裝作為其底層容器類,queue提供一組特 定的成員函數來訪問其元素。元素從特定容器的“尾部”彈出,其稱為優先隊列的頂部。
4. 底層容器可以是任何標準容器類模板,也可以是其他特定設計的容器類。容器應該可以通過隨機訪問迭 代器訪問,并支持以下操作:
  • empty():檢測容器是否為空
  • size():返回容器中有效元素個數
  • front():返回容器中第一個元素的引用
  • push_back():在容器尾部插入元素
  • pop_back():刪除容器尾部元素
5. 標準容器類vector和deque滿足這些需求。默認情況下,如果沒有為特定的priority_queue類實例化指 定容器類,則使用vector。
6. 需要支持隨機訪問迭代器,以便始終在內部保持堆結構。容器適配器通過在需要時自動調用算法函數 make_heap、push_heap和pop_heap來自動完成此操作。

?

priority_queue文檔介紹:https://cplusplus.com/reference/queue/priority_queue/

3.2 priority_queue的使用

優先級隊列默認使用vector作為其底層存儲數據的容器,在vector上又使用了堆算法將vector中元素構造成 堆的結構,因此priority_queue就是堆,所有需要用到堆的位置,都可以考慮使用? ? ? ?priority_queue。注意: 默認情況下priority_queue是大堆

?簡單代碼演示:

#include <iostream>
#include <queue>
#include <vector>
using namespace std;int main() {// 1. 構造空的優先級隊列(默認最大堆)priority_queue<int> pq1;// 也可以用迭代器范圍構造,比如從 vector 構造vector<int> v = {3, 1, 4};priority_queue<int> pq2(v.begin(), v.end());// 2. empty():檢測是否為空cout << "pq1 is empty? " << (pq1.empty() ? "true" : "false") << endl;cout << "pq2 is empty? " << (pq2.empty() ? "true" : "false") << endl;// 3. push(x):插入元素pq1.push(5);pq1.push(2);pq1.push(7);// 4. top():返回堆頂(最大)元素cout << "pq1 top element: " << pq1.top() << endl;cout << "pq2 top element: " << pq2.top() << endl;// 5. pop():刪除堆頂元素pq1.pop();cout << "After pop, pq1 top element: " << pq1.top() << endl;pq2.pop();cout << "After pop, pq2 top element: " << pq2.top() << endl;return 0;
}

3.4 priority_queue的模擬實現

通過對priority_queue的底層結構就是堆,因此此處只需對對進行通用的封裝即可。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;template <typename T>
class MyPriorityQueue {
private:vector<T> data;// 向上調整堆void siftUp(int index) {while (index > 0) {int parent = (index - 1) / 2;if (data[parent] < data[index]) {swap(data[parent], data[index]);index = parent;} else {break;}}}// 向下調整堆void siftDown(int index) {int n = data.size();while (true) {int left = 2 * index + 1;int right = 2 * index + 2;int maxIndex = index;if (left < n && data[left] > data[maxIndex]) {maxIndex = left;}if (right < n && data[right] > data[maxIndex]) {maxIndex = right;}if (maxIndex != index) {swap(data[index], data[maxIndex]);index = maxIndex;} else {break;}}}public:// 構造空隊列MyPriorityQueue() {}// 用迭代器范圍構造template <typename Iter>MyPriorityQueue(Iter first, Iter last) {while (first != last) {data.push_back(*first);first++;}// 構建堆,從最后一個非葉子節點開始向下調整for (int i = data.size() / 2 - 1; i >= 0; i--) {siftDown(i);}}bool empty() const {return data.empty();}T top() const {if (empty()) {throw "Queue is empty!";}return data[0];}void push(const T& x) {data.push_back(x);siftUp(data.size() - 1);}void pop() {if (empty()) {throw "Queue is empty!";}swap(data[0], data.back());data.pop_back();siftDown(0);}
};int main() {// 測試模擬實現的優先級隊列MyPriorityQueue<int> pq1;vector<int> v = {3, 1, 4};MyPriorityQueue<int> pq2(v.begin(), v.end());cout << "pq1 is empty? " << (pq1.empty() ? "true" : "false") << endl;cout << "pq2 is empty? " << (pq2.empty() ? "true" : "false") << endl;pq1.push(5);pq1.push(2);pq1.push(7);cout << "pq1 top element: " << pq1.top() << endl;cout << "pq2 top element: " << pq2.top() << endl;pq1.pop();cout << "After pop, pq1 top element: " << pq1.top() << endl;pq2.pop();cout << "After pop, pq2 top element: " << pq2.top() << endl;return 0;
}

4.容器適配器

4.1 什么是適配器

適配器是一種設計模式(設計模式是一套被反復使用的、多數人知曉的、經過分類編目的、代碼設計經驗的總 結),該種模式是將一個類的接口轉換成客戶希望的另外一個接口

4.2 STL標準庫中stack和queue的底層結構

雖然stack和queue中也可以存放元素,但在STL中并沒有將其劃分在容器的行列,而是將其稱為容器適配器,這是因為stack和隊列只是對其他容器的接口進行了包裝,STL中stack和queue默認使用deque,比如:

4.3 deque的簡單介紹(了解)

4.3.1 deque的原理介紹

deque(雙端隊列):是一種雙開口的"連續"空間的數據結構,雙開口的含義是:可以在頭尾兩端進行插入和 刪除操作,且時間復雜度為O(1),與vector比較,頭插效率高,不需要搬移元素;與list比較,空間利用率比較高
deque并不是真正連續的空間,而是由一段段連續的小空間拼接而成的,實際deque類似于一個動態的二維 數組,其底層結構如下圖所示:
雙端隊列底層是一段假象的連續空間,實際是分段連續的,為了維護其“整體連續”以及隨機訪問的假象,落 在了deque的迭代器身上,因此deque的迭代器設計就比較復雜,如下圖所示:

那deque是如何借助其迭代器維護其假想連續的結構呢??

4.3.2 deque的缺陷

與vector比較,deque的優勢是:頭部插入和刪除時,不需要搬移元素,效率特別高,而且在擴容時,也不 需要搬移大量的元素,因此其效率是必vector高的。
與list比較,其底層是連續空間,空間利用率比較高,不需要存儲額外字段。
但是,deque有一個致命缺陷:不適合遍歷,因為在遍歷時,deque的迭代器要頻繁的去檢測其是否移動到 某段小空間的邊界,導致效率低下,而序列式場景中,可能需要經常遍歷,因此在實際中,需要線性結構 時,大多數情況下優先考慮vector和list,deque的應用并不多,而目前能看到的一個應用就是,STL用其作 為stack和queue的底層數據結構

4.4 為什么選擇deque作為stack和queue的底層默認容器

stack是一種后進先出的特殊線性數據結構,因此只要具有push_back()和pop_back()操作的線性結構,都可 以作為stack的底層容器,比如vector和list都可以;queue是先進先出的特殊線性數據結構,只要具有 push_back和pop_front操作的線性結構,都可以作為queue的底層容器,比如list。但是STL中對stack和 queue默認選擇deque作為其底層容器,主要是因為:
  • 1. stack和queue不需要遍歷(因此stack和queue沒有迭代器),只需要在固定的一端或者兩端進行操作。
  • 2. 在stack中元素增長時,deque比vector的效率高(擴容時不需要搬移大量數據);queue中的元素增長 時,deque不僅效率高,而且內存使用率高。 結合了deque的優點,而完美的避開了其缺陷。

4.5 STL標準庫中對于stack和queue的模擬實現

4.5.1 stack的模擬實現

#include <iostream>
#include <deque>// 模擬實現stack
template <typename T, typename Container = std::deque<T>>
class Stack {
public:// 構造函數,默認使用deque作為底層容器Stack() {}// 入棧操作,將元素壓入棧頂void push(const T& value) {container.push_back(value);}// 出棧操作,移除棧頂元素void pop() {if (!empty()) {container.pop_back();}}// 獲取棧頂元素的引用T& top() {return container.back();}const T& top() const {return container.back();}// 判斷棧是否為空bool empty() const {return container.empty();}// 獲取棧中元素的個數size_t size() const {return container.size();}private:Container container;
};

測試代碼:?

int main() {Stack<int> myStack;myStack.push(10);myStack.push(20);std::cout << "棧頂元素: " << myStack.top() << std::endl;myStack.pop();std::cout << "棧是否為空: " << (myStack.empty()? "是" : "否") << std::endl;return 0;
}

?


4.5.2 queue的模擬實現

#include <iostream>
#include <deque>// 模擬實現queue
template <typename T, typename Container = std::deque<T>>
class Queue {
public:// 構造函數,默認使用deque作為底層容器Queue() {}// 入隊操作,將元素添加到隊尾void push(const T& value) {container.push_back(value);}// 出隊操作,移除隊頭元素void pop() {if (!empty()) {container.pop_front();}}// 獲取隊頭元素的引用T& front() {return container.front();}const T& front() const {return container.front();}// 獲取隊尾元素的引用T& back() {return container.back();}const T& back() const {return container.back();}// 判斷隊列是否為空bool empty() const {return container.empty();}// 獲取隊列中元素的個數size_t size() const {return container.size();}private:Container container;
};

測試代碼:?

int main() {Queue<int> myQueue;myQueue.push(10);myQueue.push(20);std::cout << "隊頭元素: " << myQueue.front() << std::endl;std::cout << "隊尾元素: " << myQueue.back() << std::endl;myQueue.pop();std::cout << "新的隊頭元素: " << myQueue.front() << std::endl;return 0;
}

結語:感謝相遇

/// 高山仰止,景行行止。雖不能至,心向往之 ///

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

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

相關文章

信息論至AI實踐:交叉熵的原理全景與應用深度解析

1 定義與數學原理&#xff1a;從信息論到分布差異度量 交叉熵&#xff08;Cross Entropy&#xff09;是信息論中用于量化兩個概率分布差異的核心概念&#xff0c;由Claude Shannon的信息論發展而來。它測量了在相同事件集合上&#xff0c;使用估計的概率分布q對服從真實概率分…

WAF 能防御哪些攻擊?

WAF&#xff08;Web 應用防火墻&#xff09;是網站和Web應用的安全守門人&#xff0c;但很多用戶對其具體防御范圍一知半解。實際上&#xff0c;WAF 能針對性攔截多種網絡攻擊&#xff0c;從常見的注入攻擊到復雜的惡意爬蟲&#xff0c;覆蓋Web安全的核心威脅。本文詳解WAF的防…

閑庭信步使用圖像驗證平臺加速FPGA的開發:第二十二課——圖像直方圖統計的FPGA實現

&#xff08;本系列只需要modelsim即可完成數字圖像的處理&#xff0c;每個工程都搭建了全自動化的仿真環境&#xff0c;只需要雙擊top_tb.bat文件就可以完成整個的仿真&#xff0c;大大降低了初學者的門檻&#xff01;&#xff01;&#xff01;&#xff01;如需要該系列的工程…

群暉中相冊管理 immich大模型的使用

相對于其他的相冊管理軟件&#xff0c;Immich的智能搜索和人臉識別功能是其優勢&#xff0c;通過應用機器學習模型&#xff0c;其智能搜索和人臉識別功能更為先進。 一、大模型的下載與安裝 網上有大佬提供了相關大模型的下載&#xff1a;https://url22.ctfile.com/d/58003522…

在 Windows 上使用 Docker 運行 Elastic Open Crawler

作者&#xff1a;來自 Elastic Matt Nowzari 了解如何使用 Docker 在 Windows 環境中運行 Open Crawler。 了解將數據攝取到 Elasticsearch 的不同方式&#xff0c;并深入實踐示例&#xff0c;嘗試一些新方法。 Elasticsearch 擁有大量新功能&#xff0c;助你為特定場景構建最…

iOS高級開發工程師面試——RunTime

iOS高級開發工程師面試——RunTime 一、簡介 二、介紹下 RunTime 的內存模型(isa、對象、類、metaclass、結構體的存儲信息等) 對象 類 三、為什么要設計 metaclass ? 四、class_copyIvarList & class_copyPropertyList區別? 五、class_rw_t 和 class_ro_t 的區別? 六…

實現分頁查詢

分頁查詢分頁查詢語句項目中添加分頁功能按鈕設置前后端代碼功能實現分頁查詢語句 限制查詢的 sql 語句&#xff1a; select * from student limit 0,4sql 查詢結果如下&#xff1a; 分頁查詢的每一頁都對應一行 sql 語句&#xff0c;若每一行都寫單獨對應的 sql 語句不僅重復…

[QOI] qoi_desc | qoi_encode | qoi_decode

鏈接&#xff1a;https://phoboslab.org/log/2021/11/qoi-fast-lossless-image-compression &#xff08;看代碼設計的時候&#xff0c;真的大為震撼&#xff0c;偉大的algorithm T.T&#xff09; docs&#xff1a;QOI圖像格式 qoi項目提出了Quite OK Image&#xff08;QOI&am…

智慧城軌可視化:一屏智管全城

圖撲智慧城軌可視化系統&#xff0c;把地鐵線路、車站、列車都搬進三維畫面。列車晚點預警、站臺擁擠提示、設備故障定位…… 這些關鍵信息一屏聚合&#xff0c;調度員能快速調整發車頻次&#xff0c;疏導高峰客流。遇上突發情況&#xff0c;系統聯動應急方案&#xff0c;同步顯…

包新的Git安裝與使用教程(2024九月更新)

目錄 一、安裝git 1.下載git 2.git安裝 3.環境變量配置與測試 二、使用教程 1.創建版本庫 2.版本回退 3.刪除和恢復文件 一、安裝git 1.下載git 官方下載地址&#xff1a;https://git-scm.com/download 然后進入以下頁面&#xff0c;點擊下載鏈接即可(windows一般都是…

中望3D 2026亮點速遞(1)-全新槽功能螺紋功能,減少繁瑣操作

本文為CAD芯智庫整理&#xff0c;未經允許請勿復制、轉載&#xff01;中望3D 2026全新的槽功能&#xff0c;包括&#xff1a;&#xff08;1&#xff09;可快速生成多種槽形&#xff1b;&#xff08;2&#xff09;快速生成一個或多個槽&#xff1b;&#xff08;3&#xff09;支持…

2025毫米波雷達技術白皮書:智能汽車與物聯網的感知核心

隨著人工智能、物聯網&#xff08;IoT&#xff09;和智能汽車產業的迅猛發展&#xff0c;毫米波雷達技術正成為感知領域的核心驅動力。毫米波雷達憑借其高精度、全天候和強抗干擾能力&#xff0c;廣泛應用于智能汽車的自動駕駛、物聯網的環境感知以及工業自動化。2025年&#x…

用 React-Three-Fiber 實現雪花下落與堆積效果:從零開始的 3D 雪景模擬

在 Web3D 開發中&#xff0c;自然現象模擬一直是極具吸引力的主題。本文將基于 React-Three-Fiber&#xff08;R3F&#xff09;框架&#xff0c;詳解如何實現一個包含雪花下落、地面堆積的完整雪景效果。我們會從基礎粒子系統入手&#xff0c;逐步完善物理交互邏輯&#xff0c;…

從抓包GitHub Copilot認證請求,認識OAuth 2.0技術

引言 在現代開發工具中&#xff0c;GitHub Copilot 以智能、嵌入式的人工智能代碼補全能力著稱。作為一項涉及用戶敏感數據和付費授權的服務&#xff0c;其認證授權流程尤為值得技術研究。本文基于實際抓包 VS Code 中的 Copilot 登錄認證請求&#xff0c;系統梳理其 OAuth 2.…

Linux操作系統之線程:分頁式存儲管理

目錄 前言&#xff1a; 一、分頁式存儲管理 二、二級頁表的地址轉化 三、缺頁中斷 總結 前言&#xff1a; 我們上篇文章簡單介紹了線程的一些知識點&#xff0c;但是還有很多坑沒有給大家填上&#xff0c;包括頁表部分我們還沒為大家說明。 本篇文章我將會繼續為大家講解…

xss1-8

Level-1<script>alert()</script>基礎反射型 無任何過濾Level-2"> <script>alert()</script> <"閉合屬性&#xff1a;">用來閉合當前標簽的value屬性注入新標簽&#xff1a;閉合屬性后&#xff0c;插入獨立的<script>…

51c嵌入式~單片機~合集1

自己的原文哦~ https://blog.51cto.com/whaosoft/11897656 一、STM32的啟動模式配置與應用 三種BOOT模式 所謂啟動&#xff0c;一般來說就是指我們下好程序后&#xff0c;重啟芯片時&#xff0c;SYSCLK的第4個上升沿&#xff0c;BOOT引腳的值將被鎖存。用戶可以通過設…

Typecho分類導航欄開發指南:從基礎到高級實現

文章目錄 Typecho分類導航欄深度解析:父分類與子分類的完美呈現 引言 一、Typecho分類系統基礎 1.1 Typecho分類結構 1.2 獲取分類數據的基本方法 二、基礎分類導航輸出 2.1 簡單的平鋪式導航 2.2 帶計數器的分類導航 三、層級分類導航實現 3.1 遞歸輸出父子分類 3.2 使用Type…

C++異步編程工具 async promise-future packaged_task等

深入探討 C11 中引入的四個核心異步編程工具&#xff1a;std::async, std::future, std::promise, 和 std::packaged_task。它們共同構成了 C 現代并發編程的基礎。 為了更好地理解&#xff0c;我們可以使用一個餐廳點餐的類比&#xff1a; std::future (取餐憑證)&#xff1…

Linux-網絡管理

網絡管理1. 網絡基礎1.1 TCP/IP 協議棧&#xff08;四層模型&#xff09;1.2 網絡設備配置與基礎概念1.3 網絡接口命名規則1.4 網絡配置文件位置2. 常用網絡配置命令2.1 查看網絡接口信息2.2 配置 IP 地址2.3 啟用/禁用網卡2.4 修改網卡 MAC 地址2.5 配置網卡的 MTU&#xff08…