總結C++中的STL

  • 1.STL 概述

STL 即標準模板庫,是 C++ 標準程序庫的重要組成部分,包含常用數據結構和算法,體現了泛型化程序設計思想,基于模板實現,提高了代碼的可復用性

2.容器

2.1 序列容器

? 1.? vector

  • 特性:動態數組,內存連續分配。隨著元素的添加,若內存空間不足,會重新分配更大的內存塊,并將原有元素復制過去。
  • 優缺點:優點是支持隨機訪問,可通過下標快速訪問任意位置的元素;在尾部插入和刪除元素效率高。缺點是在中間或頭部插入和刪除元素效率低,因為需要移動后續元素。
  • 常用操作
  • #include <vector>
    #include <iostream>
    int main() {std::vector<int> vec;vec.push_back(10); // 尾部插入元素vec.insert(vec.begin(), 5); // 在開頭插入元素std::cout << vec[1] << std::endl; // 隨機訪問元素vec.pop_back(); // 尾部刪除元素return 0;
    }
    

    2. deque

    • 特性:雙端隊列,由多個固定大小的數組塊組成,支持在兩端快速插入和刪除元素,同時也支持隨機訪問。
    • 優缺點:優點是在兩端插入和刪除元素的時間復雜度為常數,適合需要頻繁在兩端操作的場景。缺點是隨機訪問的效率略低于?vector
    • 常用操作
  • #include <deque>
    #include <iostream>
    int main() {std::deque<int> dq;dq.push_front(1); // 頭部插入元素dq.push_back(2); // 尾部插入元素std::cout << dq[0] << std::endl; // 隨機訪問元素dq.pop_front(); // 頭部刪除元素return 0;
    }
    

? ? ? ? 3. list

  • 特性:雙向鏈表,每個節點包含數據和指向前一個節點和后一個節點的指針。
  • 優缺點:優點是在任意位置插入和刪除元素的時間復雜度為常數,適合頻繁插入和刪除的操作。缺點是不支持隨機訪問,訪問元素需要從頭或尾開始遍歷。
  • 常用操作
  • #include <list>
    #include <iostream>
    int main() {std::list<int> lst = {1, 2, 3};auto it = lst.begin();++it;lst.insert(it, 4); // 在指定位置插入元素lst.erase(it); // 刪除指定位置元素for (int i : lst) {std::cout << i << " ";}return 0;
    }

2.2 關聯容器

1.set

  • 特性:元素唯一且有序,底層通常實現為紅黑樹(一種自平衡二叉搜索樹)。插入、刪除和查找元素的時間復雜度為?O(logn)。
  • 優缺點:優點是元素自動排序,且能保證元素的唯一性。缺點是插入和查找操作的時間復雜度不是常數級。
  • 常用操作
#include <set>
#include <iostream>
int main() {std::set<int> s;s.insert(3);s.insert(1);auto it = s.find(1); // 查找元素if (it != s.end()) {std::cout << "Found" << std::endl;}return 0;
}

2.multiset

  • 特性:與?set?類似,但允許元素重復。
  • 常用操作:基本與?set?相同,只是插入重復元素時不會被忽略。

3.map

  • 特性:鍵值對的集合,鍵唯一且有序,底層同樣是紅黑樹。可通過鍵快速查找對應的值。
  • 優缺點:優點是查找和插入操作的時間復雜度為?O(logn),且能保證鍵的有序性。缺點是空間開銷較大。
  • 常用操作
#include <map>
#include <iostream>
#include <string>
int main() {std::map<std::string, int> m;m["apple"] = 10; // 插入鍵值對auto it = m.find("apple"); // 查找鍵if (it != m.end()) {std::cout << it->second << std::endl; // 輸出對應的值}return 0;
}

4.multimap

  • 特性:與?map?類似,但允許鍵重復。

2.2 無序容器

? ?1.unordered_set

  • 特性:無序集合,元素唯一,底層實現為哈希表。插入、刪除和查找元素的平均時間復雜度為?O(1)。
  • 優缺點:優點是查找和插入操作的平均時間復雜度為常數級。缺點是元素無序,且哈希沖突可能會影響性能。
  • 常用操作
#include <unordered_set>
#include <iostream>
int main() {std::unordered_set<int> us;us.insert(3);auto it = us.find(3); // 查找元素if (it != us.end()) {std::cout << "Found" << std::endl;}return 0;
}

2.unordered_multiset

  • 特性:與?unordered_set?類似,但允許元素重復。

3.unordered_map

  • 特性:無序鍵值對集合,底層為哈希表。適合快速查找鍵對應的值。
  • 常用操作
#include <unordered_map>
#include <iostream>
#include <string>
int main() {std::unordered_map<std::string, int> um;um["apple"] = 10; // 插入鍵值對auto it = um.find("apple"); // 查找鍵if (it != um.end()) {std::cout << it->second << std::endl; // 輸出對應的值}return 0;
}

4.unordered_multimap

  • 特性:與?unordered_map?類似,但允許鍵重復。

3. 迭代器(Iterators)

3.1 輸入迭代器

  • 特性:只能用于讀取容器中的元素,不支持寫入操作,且只能單向移動,每次移動一步。例如?find?算法使用輸入迭代器來查找元素。
#include <vector>
#include <algorithm>
#include <iostream>
int main() {std::vector<int> vec = {1, 2, 3};auto it = std::find(vec.begin(), vec.end(), 2);if (it != vec.end()) {std::cout << *it << std::endl;}return 0;
}

3.2 輸出迭代器

  • 特性:只能用于向容器中寫入元素,不支持讀取操作,同樣只能單向移動,每次移動一步。例如?copy?算法使用輸出迭代器將元素從一個容器復制到另一個容器。
#include <vector>
#include <algorithm>
#include <iostream>
int main() {std::vector<int> src = {1, 2, 3};std::vector<int> dest(3);std::copy(src.begin(), src.end(), dest.begin());for (int i : dest) {std::cout << i << " ";}return 0;
}

3.3 前向迭代器

  • 特性:支持讀取和寫入操作,并且可以向前移動,允許多次遍歷容器。例如?forward_list?的迭代器就是前向迭代器。
#include <forward_list>
#include <iostream>
int main() {std::forward_list<int> fl = {1, 2, 3};for (auto it = fl.begin(); it != fl.end(); ++it) {*it *= 2; // 寫入操作}for (int i : fl) {std::cout << i << " ";}return 0;
}

3.4 雙向迭代器

  • 特性:支持讀取、寫入和雙向移動,可用于雙向鏈表等數據結構。例如?list?的迭代器就是雙向迭代器。
#include <list>
#include <iostream>
int main() {std::list<int> lst = {1, 2, 3};auto it = lst.end();--it; // 反向移動std::cout << *it << std::endl;return 0;
}

3.5.隨機訪問迭代器

  • 特性:支持隨機訪問,可通過下標快速訪問任意位置的元素,還支持雙向移動和跳躍移動。例如?vector?的迭代器就是隨機訪問迭代器。
#include <vector>
#include <iostream>
int main() {std::vector<int> vec = {1, 2, 3};auto it = vec.begin() + 2; // 跳躍移動std::cout << *it << std::endl;return 0;
}

4.算法

4.1 排序算法

1.sort

  • 功能:對指定范圍內的元素進行排序,默認使用升序排序。
  • 示例
#include <vector>
#include <algorithm>
#include <iostream>
int main() {std::vector<int> vec = {3, 1, 2};std::sort(vec.begin(), vec.end());for (int i : vec) {std::cout << i << " ";}return 0;
}

2.stable_sort

  • 功能:與?sort?類似,但能保證相等元素的相對順序不變。

4.2 查找算法

1.find

  • 功能:在指定范圍內查找指定值的元素,返回第一個匹配元素的迭代器。
  • 示例
#include <vector>
#include <algorithm>
#include <iostream>
int main() {std::vector<int> vec = {1, 2, 3};auto it = std::find(vec.begin(), vec.end(), 2);if (it != vec.end()) {std::cout << "Found" << std::endl;}return 0;
}

2.binary_search

  • 功能:在有序范圍內進行二分查找,判斷指定值是否存在。
  • 示例
#include <vector>
#include <algorithm>
#include <iostream>
int main() {std::vector<int> vec = {1, 2, 3};bool found = std::binary_search(vec.begin(), vec.end(), 2);if (found) {std::cout << "Found" << std::endl;}return 0;
}

4.3 遍歷算法

1. for_each:對容器中的每個元素執行指定的函數或函數對象。

#include <vector>
#include <algorithm>
#include <iostream>
void print(int i) {std::cout << i << " ";
}
int main() {std::vector<int> vec = {1, 2, 3};std::for_each(vec.begin(), vec.end(), print);return 0;
}

2. transform:將一個容器中的元素按照指定的規則轉換為另一個容器中的元素。

4.4 數值算法

1. accumulate:計算容器中元素的總和,還可以指定一個初始值,時間復雜度為?O(n)。

示例:

#include <vector>
#include <numeric>
#include <iostream>
int main() {std::vector<int> vec = {1, 2, 3};int sum = std::accumulate(vec.begin(), vec.end(), 0);std::cout << sum << std::endl;return 0;
}

2. inner_product:計算兩個容器對應元素的乘積之和,可用于計算向量的內積等。

4.5.仿函數

仿函數是一個重載了函數調用運算符?()?的類或結構體。

可以像函數一樣被調用,并且可以攜帶狀態信息。

在 STL 算法中,常作為參數來定制算法的行為,例如定義比較規則、計算規則等。

1.一元仿函數

  • 示例:定義一個仿函數用于判斷元素是否為偶數。
#include <vector>
#include <algorithm>
#include <iostream>
struct IsEven {bool operator()(int num) const {return num % 2 == 0;}
};
int main() {std::vector<int> vec = {1, 2, 3};auto it = std::find_if(vec.begin(), vec.end(), IsEven());if (it != vec.end()) {std::cout << *it << std::endl;}return 0;
}

2.二元仿函數

  • 示例:定義一個仿函數用于降序排序。
#include <vector>
#include <algorithm>
#include <iostream>
struct GreaterThan {bool operator()(int a, int b) const {return a > b;}
};
int main() {std::vector<int> vec = {1, 2, 3};std::sort(vec.begin(), vec.end(), GreaterThan());for (int i : vec) {std::cout << i << " ";}return 0;
}

6.適配器

6.1 容器適配器

1.stack:棧適配器,基于 deque 或 vector 實現,提供了后進先出(LIFO)的存儲方式。

  • 常用操作
#include <stack>
#include <iostream>
int main() {std::stack<int> st;st.push(1);st.push(2);std::cout << st.top() << std::endl; // 訪問棧頂元素st.pop(); // 彈出棧頂元素return 0;
}

2.queue:隊列適配器,基于 deque 實現,提供了先進先出(FIFO)的存儲方式。

  • 常用操作
#include <queue>
#include <iostream>
int main() {std::queue<int> q;q.push(1);q.push(2);std::cout << q.front() << std::endl; // 訪問隊首元素q.pop(); // 彈出隊首元素return 0;
}

3.priority_queue:優先隊列適配器,基于 vector 實現,元素按照優先級進行存儲和訪問。

  • 常用操作
#include <queue>
#include <iostream>
int main() {std::priority_queue<int> pq;pq.push(3);pq.push(1);std::cout << pq.top() << std::endl; // 訪問隊首元素pq.pop(); // 彈出隊首元素return 0;
}

6.2 迭代器適配器

1.reverse_iterator:反向迭代器,用于反向遍歷容器,通過將正向迭代器進行封裝,實現了與正向迭代器相反的遍歷順序。

示例:

#include <vector>
#include <iostream>
int main() {std::vector<int> vec = {1, 2, 3};for (auto it = vec.rbegin(); it != vec.rend(); ++it) {std::cout << *it << " ";}return 0;
}

2.back_insert_iterator:后插入迭代器,用于在容器尾部插入元素,常用于將元素插入到一個動態增長的容器中。

6.3 仿函數適配器

1.bind:用于綁定仿函數的參數,將一個多參數的仿函數轉換為一個少參數的仿函數。

示例:

#include <iostream>
#include <functional>
int add(int a, int b) {return a + b;
}
int main() {auto add5 = std::bind(add, 5, std::placeholders::_1);std::cout << add5(3) << std::endl; // 輸出 8return 0;
}

2.not1not2:用于對一元和二元仿函數取反,即返回與原仿函數相反的結果。以下將更詳細地介紹 C++ STL 的各個組成部分:

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

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

相關文章

自動駕駛-一位從業兩年的獨特視角

時間簡介 2023.03 作為一名大三學生&#xff0c;加入到某量產車企&#xff0c;從事地圖匹配研發 2023.07 地圖匹配項目交付&#xff0c;參與離線云端建圖研發 2023.10 拿到24屆校招offer 2024.07 正式入職 2025.01 離線云端建圖穩定&#xff0c;開始接觸在線車端融圖研發 自動…

《軟件設計師》復習筆記(11.1)——生命周期、CMM、開發模型

目錄 一、信息系統生命周期 系統規劃階段 系統分析階段&#xff08;邏輯設計&#xff09; 系統設計階段&#xff08;物理設計&#xff09; 系統實施階段 系統運行與維護階段 二、能力成熟度模型&#xff08;CMM/CMMI&#xff09; CMM 五級模型 CMMI 兩種表示方法 真題…

1.67g 雨晨 22635.5305 Windows 11 企業版 23H2 極速增強版

五一特別制作 &#xff08;主要更新簡述&#xff09; 全程由最新YCDISM2025裝載制作 1、可選功能&#xff1a; 添加&#xff1a; Microsoft-Windows-LanguageFeatures-Basic-en-us-Package Microsoft-Windows-LanguageFeatures-OCR-en-us-Package 2、功能增強&a…

爬蟲逆向思維

爬蟲逆向思維是指從目標網站的反爬機制入手&#xff0c;通過分析其防護邏輯來突破限制&#xff0c;獲取數據的思路。以下是核心要點&#xff1a; 核心方向 - 分析反爬手段&#xff1a;如請求頭校驗、IP封禁、驗證碼、動態數據加密等。 - 模擬真實行為&#xff1a;偽造瀏覽器指…

手撕哈希表

引入&#xff1a;unordered_set /map是什么&#xff1f; 庫里面除開set和map&#xff0c;還有unordered_set 和 unordered_map&#xff0c;區別在于&#xff1a; ①&#xff1a;set和map的底層結構是紅黑樹&#xff0c;而unordered_set和unordered_map的底層是哈希表 ②&…

基于Docker的內網穿透實戰:frp 0.68 + Nginx最佳實踐

在實際應用中&#xff0c;我們常常遇到這樣的需求&#xff1a; 家里的NAS服務器、開發環境、測試服務&#xff0c;需要暴露到公網訪問 企業內部系統&#xff0c;僅允許在特定域名或端口暴露&#xff0c;但沒有公網IP 多個內網應用&#xff0c;希望通過一個統一的外網入口訪問…

完美中國制度流程體系建設(70頁PPT)(文末有下載方式)

資料解讀&#xff1a;《完美中國制度流程體系建設》 詳細資料請看本解讀文章的最后內容。 該文檔圍繞完美中國制度流程體系建設展開&#xff0c;從風險管理流程等前期工作切入&#xff0c;全面剖析企業制度流程體系框架&#xff0c;結合案例指出常見問題&#xff0c;評估完美公…

計算機組成原理實驗(5) 堆棧寄存器實驗

實驗五 堆棧寄存器實驗 一、實驗目的 1、熟悉堆棧概念 2、熟悉堆棧寄存器的組成和硬件電路 二、實驗要求 按照實驗步驟完成實驗項目&#xff0c;對4個堆棧寄存器進行讀出、寫入數據操作。 三、實驗說明 3.1 堆棧寄存器組實驗構成&#xff08;圖3-1&#xff09; 本系統…

RAGFlow報錯:ESConnection.sql got exception

環境&#xff1a; Ragflowv0.17.2 問題描述&#xff1a; RAGFlow報錯&#xff1a;ESConnection.sql got exception _ming_cheng_tks, 浙江, operatorOR;minimum_should_match30%) 2025-04-25 15:55:06,862 INFO 244867 POST http://localhost:1200/_sql?formatjson […

鼠標滾動字體縮放

在VsCode中編輯文件時&#xff0c;有時候發現Ctrl鼠標滾輪并不能縮放字體&#xff0c;下面是啟用這個功能的方法。 第一步&#xff1a; 進入設置&#xff0c;可以從左下角按鈕菜單進入&#xff0c;也可以使用【Ctrl,】。 第二步&#xff1a; 啟用鼠標滾輪縮放功能 第三步&…

深度學習·經典模型·VisionTransformer

VIT embedding處理與標準的Transformer不同&#xff0c;其他基本一致 E&#xff4d;bedding Graph: ( H , W , C ) (H,W,C) (H,W,C) Patch: ( N , P 2 C ) (N,P^2C) (N,P2C),其中 N H ? W P 2 N\frac{H*W}{P^2} NP2H?W?, P P P是patch的大小 注意的是,論文了保留與Bert的…

Python Selenium 完全指南:從入門到精通

Python Selenium 完全指南&#xff1a;從入門到精通 &#x1f4da; 目錄 環境準備與基礎入門元素定位與交互操作等待機制與異常處理面向對象封裝與框架設計進階技巧與最佳實踐性能優化與調試技巧實戰案例分析 環境準備與基礎入門 1. 安裝 Selenium 與瀏覽器驅動 安裝 Selen…

基于ffmpeg的音視頻編碼

1 音頻編碼 本質上是由pcm文件轉到一個協議文件 比如說aac協議 1.1 音頻基本知識回歸 比特率 比特率是指單位時間內傳輸或處理的比特&#xff08;bit&#xff09;數量&#xff0c;通常用 bps&#xff08;bits per second&#xff0c;比特每秒&#xff09;來表示。它是衡量數…

BT137-ASEMI機器人功率器件專用BT137

編輯&#xff1a;LL BT137-ASEMI機器人功率器件專用BT137 型號&#xff1a;BT137 品牌&#xff1a;ASEMI 封裝&#xff1a;TO-220F 批號&#xff1a;最新 引腳數量&#xff1a;3 封裝尺寸&#xff1a;如圖 特性&#xff1a;雙向可控硅 工作結溫&#xff1a;-40℃~150℃…

攻防世界 dice_game

dice_game ??????dice_game (1) motalymotaly-VMware-Virtual-Platform:~/桌面$ file game game: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]254…

Astral Ascent 星界戰士(星座上升) [DLC 解鎖] [Steam] [Windows SteamOS macOS]

Astral Ascent 星界戰士&#xff08;星座上升&#xff09; [DLC 解鎖] [Steam] [Windows & SteamOS & macOS] 需要有游戲正版基礎本體&#xff0c;安裝路徑不能帶有中文&#xff0c;或其它非常規拉丁字符&#xff1b; DLC 版本 至最新全部 DLC 后續可能無法及時更新文章…

git中reset和checkout的用法

git reset&#xff1a;重置分支的歷史與工作區? 核心作用??&#xff1a;移動當前分支的指針&#xff08;即改變分支的歷史&#xff09;&#xff0c;并可選地修改暫存區&#xff08;Index&#xff09;和工作目錄&#xff08;Working Directory&#xff09;。常用于撤銷提交或…

權限提升—Linux提權內核溢出漏洞輔助項目

前言 今天開啟Linux提權的篇章&#xff0c;主要是講一下Linux的內核漏洞提權&#xff0c;利用方式和Windows系統漏洞提權差不多&#xff0c;也是網上的項目掃一下&#xff0c;然后根據漏洞編號去找exp即可。 信息收集 首先要說一下Linux用戶的權限劃分。 系統用戶&#xff…

React Native Redux 使用指南 redux-toolkit

React Native Redux 使用指南 redux-toolkit 一個可預測和可維護的全局狀態管理 JavaScript 庫 Redux 和 React-Redux以及**reduxjs/toolkit 的關系&#xff1a;** Redux、React-Redux、reduxjs/toolkit 是 React 生態中狀態管理的「黃金三角組合」&#xff0c;它們的關系可…

JVM——Java 虛擬機是如何加載 Java 類的?

引入 在 Java 世界的底層運作中&#xff0c;類加載機制扮演著一個既神秘又關鍵的角色。它就像是一個精心設計的舞臺幕后 machinery&#xff0c;確保了 Java 程序能夠順利運行。今天&#xff0c;我們就深入探索 Java 虛擬機&#xff08;JVM&#xff09;是如何加載 Java 類的。 …