C++STL標準模板庫詳解

一、引言

STL(Standard Template Library)是 C++ 標準庫的核心組成部分,其中容器(Containers)?作為數據存儲的基礎組件,為開發者提供了豐富的數據結構選擇。本文將聚焦 STL 容器的核心類型,結合具體 C++ 代碼示例詳解其特性、用法及適用場景,幫助讀者在實際開發中精準選型。

二、序列容器(Sequence Containers)

序列容器按元素插入順序存儲數據,支持按位置訪問,是最常用的容器類型。

2.1?std::vector:動態數組

特性:內存連續存儲,支持隨機訪問,尾部插入 / 刪除高效,中間插入 / 刪除開銷大。
適用場景:需要頻繁隨機訪問、尾部操作的場景(如存儲動態列表、緩存數據)。

代碼示例:
#include <iostream>
#include <vector>
using namespace std;int main() {// 1. 初始化方式vector<int> vec1; // 空vectorvector<int> vec2(5, 10); // 5個元素,每個初始化為10vector<int> vec3 = {1, 2, 3, 4, 5}; // 初始化列表// 2. 尾部插入元素vec1.push_back(6);vec1.push_back(7);// 3. 隨機訪問([]或at())cout << "vec3[2] = " << vec3[2] << endl; // 輸出3cout << "vec3.at(3) = " << vec3.at(3) << endl; // 輸出4(帶越界檢查)// 4. 遍歷元素(迭代器)cout << "vec3元素:";for (vector<int>::iterator it = vec3.begin(); it != vec3.end(); ++it) {cout << *it << " ";}cout << endl;// 5. 容量與大小cout << "vec3大小:" << vec3.size() << endl; // 5cout << "vec3容量:" << vec3.capacity() << endl; // 至少5(動態擴容)// 6. 中間插入元素(效率較低)vec3.insert(vec3.begin() + 2, 99); // 在索引2處插入99cout << "插入后vec3[2] = " << vec3[2] << endl; // 輸出99return 0;
}

2.2?std::list:雙向鏈表

特性:非連續存儲,通過指針連接元素,任意位置插入 / 刪除高效,不支持隨機訪問。
適用場景:需要頻繁在中間插入 / 刪除元素的場景(如實現鏈表、隊列、鄰接表)。

代碼示例:
#include <iostream>
#include <list>
using namespace std;int main() {// 初始化列表list<int> lst = {3, 1, 4, 1, 5};// 1. 頭部/尾部操作lst.push_front(0); // 頭部插入0lst.push_back(6); // 尾部插入6// 2. 遍歷(不支持[]訪問,需迭代器)cout << "list元素:";for (auto it = lst.begin(); it != lst.end(); ++it) {cout << *it << " ";}cout << endl; // 輸出:0 3 1 4 1 5 6// 3. 中間插入/刪除auto it = lst.begin();advance(it, 2); // 移動迭代器到第2個元素(值為3的下一個元素1)lst.insert(it, 99); // 在1前插入99cout << "插入后元素:";for (int num : lst) { // 范圍for循環cout << num << " ";}cout << endl; // 輸出:0 3 99 1 4 1 5 6// 4. 刪除指定值的元素lst.remove(1); // 刪除所有值為1的元素cout << "刪除1后元素:";for (int num : lst) {cout << num << " ";}cout << endl; // 輸出:0 3 99 4 5 6return 0;
}

2.3?std::deque:雙端隊列

特性:分段連續內存,支持兩端高效插入 / 刪除,隨機訪問效率略低于 vector。
適用場景:需要頻繁在頭部和尾部操作的場景(如實現隊列、緩沖區)。

代碼示例:
#include <iostream>
#include <deque>
using namespace std;int main() {deque<int> dq;// 1. 兩端插入dq.push_back(10); // 尾部插入dq.push_front(5); // 頭部插入dq.push_back(20);dq.push_front(1);// 2. 隨機訪問cout << "dq[1] = " << dq[1] << endl; // 輸出5cout << "dq.at(2) = " << dq.at(2) << endl; // 輸出10// 3. 遍歷cout << "deque元素:";for (int num : dq) {cout << num << " ";}cout << endl; // 輸出:1 5 10 20// 4. 兩端刪除dq.pop_front(); // 刪除頭部元素1dq.pop_back(); // 刪除尾部元素20cout << "刪除后元素:";for (int num : dq) {cout << num << " ";}cout << endl; // 輸出:5 10return 0;
}

三、關聯容器(Associative Containers)

關聯容器基于鍵(Key)存儲元素,內部通常用紅黑樹實現,元素自動排序,支持高效查找。

3.1?std::set:有序唯一集合

特性:元素唯一且按升序排列,插入 / 查找 / 刪除時間復雜度 O (log n)。
適用場景:需要去重并保持有序的集合(如存儲唯一 ID、實現集合運算)。

代碼示例:
#include <iostream>
#include <set>
using namespace std;int main() {// 初始化(自動排序+去重)set<int> s = {5, 2, 8, 2, 5, 9};// 1. 插入元素s.insert(3);// 2. 遍歷(默認升序)cout << "set元素:";for (int num : s) {cout << num << " ";}cout << endl; // 輸出:2 3 5 8 9// 3. 查找元素auto it = s.find(5);if (it != s.end()) {cout << "找到元素:" << *it << endl;} else {cout << "未找到元素" << endl;}// 4. 刪除元素s.erase(8); // 刪除值為8的元素cout << "刪除8后元素:";for (int num : s) {cout << num << " ";}cout << endl; // 輸出:2 3 5 9return 0;
}

3.2?std::map:有序鍵值對映射

特性:鍵唯一且按升序排列,通過鍵快速訪問值,時間復雜度 O (log n)。
適用場景:需要鍵值對映射的場景(如字典、配置表、索引表)。

代碼示例:
#include <iostream>
#include <map>
#include <string>
using namespace std;int main() {// 初始化鍵值對(鍵為int,值為string)map<int, string> student;// 1. 插入元素(三種方式)student[101] = "Alice"; // 下標法student.insert(pair<int, string>(102, "Bob")); // pair插入student.emplace(103, "Charlie"); // emplace(更高效)// 2. 遍歷鍵值對cout << "學生信息:" << endl;for (auto& pair : student) { // 注意用引用避免拷貝cout << "學號:" << pair.first << ",姓名:" << pair.second << endl;}// 輸出:// 學號:101,姓名:Alice// 學號:102,姓名:Bob// 學號:103,姓名:Charlie// 3. 查找鍵對應的值int id = 102;auto it = student.find(id);if (it != student.end()) {cout << id << "對應的姓名:" << it->second << endl; // 輸出Bob}// 4. 刪除鍵student.erase(101);cout << "刪除101后學號101是否存在:" << (student.count(101) ? "是" : "否") << endl; // 輸出否return 0;
}

3.3?std::multiset?與?std::multimap:允許重復鍵

特性multiset?允許重復元素,multimap?允許重復鍵,均有序排列。
適用場景:需要存儲重復元素 / 鍵的場景(如統計頻率、一對多映射)。

代碼示例(multimap):
#include <iostream>
#include <map>
#include <string>
using namespace std;int main() {// 課程-學生映射(一門課對應多個學生)multimap<string, string> course;// 插入重復鍵course.insert({"Math", "Alice"});course.insert({"Math", "Bob"});course.insert({"Physics", "Charlie"});course.insert({"Math", "David"});// 1. 遍歷所有鍵值對cout << "所有課程學生:" << endl;for (auto& pair : course) {cout << pair.first << ":" << pair.second << endl;}// 2. 查找特定鍵的所有值string key = "Math";cout << "\n" << key << "的學生:" << endl;auto range = course.equal_range(key); // 獲取鍵為Math的范圍for (auto it = range.first; it != range.second; ++it) {cout << it->second << endl; // 輸出Alice、Bob、David}return 0;
}

四、無序關聯容器(Unordered Associative Containers)

C++11 引入,基于哈希表實現,元素無序,平均插入 / 查找 / 刪除時間復雜度 O (1)。

4.1?std::unordered_set:無序唯一集合

特性:元素唯一、無序,哈希表存儲,查找效率極高(無排序開銷)。
適用場景:只需去重和快速查找,不關心順序的場景(如黑名單、存在性判斷)。

代碼示例:
#include <iostream>
#include <unordered_set>
using namespace std;int main() {unordered_set<string> fruits = {"apple", "banana", "orange"};// 1. 插入元素fruits.insert("grape");// 2. 遍歷(無序)cout << "無序集合元素:";for (auto& fruit : fruits) {cout << fruit << " ";}cout << endl; // 輸出順序不確定// 3. 快速查找string target = "banana";if (fruits.count(target)) { // count()判斷存在性cout << target << " 存在于集合中" << endl;}return 0;
}

4.2?std::unordered_map:無序鍵值對映射

特性:鍵唯一、無序,哈希表存儲,適合高頻查找場景。
適用場景:需要快速鍵值映射且不關心順序的場景(如緩存、哈希表)。

代碼示例:
#include <iostream>
#include <unordered_map>
#include <string>
using namespace std;int main() {// 姓名-年齡映射(無序)unordered_map<string, int> age;age["Alice"] = 20;age["Bob"] = 22;age["Charlie"] = 21;// 1. 遍歷(無序)cout << "姓名-年齡:" << endl;for (auto& pair : age) {cout << pair.first << ":" << pair.second << endl;}// 2. 查找效率對比(哈希表 vs 紅黑樹)// 對于高頻查找,unordered_map性能優于mapcout << "Bob的年齡:" << age["Bob"] << endl;return 0;
}

五、容器適配器(Container Adapters)

基于基礎容器封裝的特殊接口,簡化特定場景使用。

5.1?std::stack:棧(LIFO)

特性:后進先出,基于 deque 默認實現,支持push(入棧)、pop(出棧)、top(取棧頂)。
適用場景:表達式求值、括號匹配、深度優先搜索(DFS)。

代碼示例:
#include <iostream>
#include <stack>
using namespace std;int main() {stack<int> st;// 入棧st.push(1);st.push(2);st.push(3);// 棧頂元素cout << "棧頂元素:" << st.top() << endl; // 輸出3// 出棧st.pop(); // 刪除棧頂元素3cout << "出棧后棧頂:" << st.top() << endl; // 輸出2// 棧大小cout << "棧大小:" << st.size() << endl; // 輸出2return 0;
}

5.2?std::queue:隊列(FIFO)

特性:先進先出,基于 deque 默認實現,支持push(入隊)、pop(出隊)、front(隊首)。
適用場景:任務調度、廣度優先搜索(BFS)、消息隊列。

代碼示例:
#include <iostream>
#include <queue>
using namespace std;int main() {queue<string> q;// 入隊q.push("任務1");q.push("任務2");q.push("任務3");// 隊首元素cout << "隊首任務:" << q.front() << endl; // 輸出任務1// 出隊q.pop(); // 移除任務1cout << "出隊后隊首:" << q.front() << endl; // 輸出任務2// 隊列大小cout << "隊列大小:" << q.size() << endl; // 輸出2return 0;
}

5.3?std::priority_queue:優先隊列

特性:元素按優先級排序(默認最大元素優先),基于 vector 默認實現。
適用場景:定時器、任務調度(高優先級先執行)、最大 / 最小堆場景。

代碼示例:
#include <iostream>
#include <queue>
using namespace std;int main() {// 最大優先隊列(默認)priority_queue<int> maxHeap;maxHeap.push(3);maxHeap.push(1);maxHeap.push(5);cout << "最大堆頂:" << maxHeap.top() << endl; // 輸出5// 最小優先隊列(通過greater<>實現)priority_queue<int, vector<int>, greater<int>> minHeap;minHeap.push(3);minHeap.push(1);minHeap.push(5);cout << "最小堆頂:" << minHeap.top() << endl; // 輸出1return 0;
}

六、容器選型決策指南

容器類型核心特性時間復雜度(插入 / 查找 / 刪除)適用場景
vector連續內存,隨機訪問尾部 O (1),中間 O (n) / O (1)隨機訪問、尾部操作多
list雙向鏈表,任意位置操作高效O(1) / O(n)頻繁中間插入 / 刪除
deque雙端操作高效,隨機訪問兩端 O (1) / O (1)雙端頻繁操作
set/map有序,唯一鍵,紅黑樹O(log n) / O(log n)有序集合、鍵值映射,需排序
unordered_set/unordered_map無序,哈希表平均 O (1) / 平均 O (1)高頻查找,不關心順序
stack/queue適配器,LIFO/FIFOO(1)棧 / 隊列特定場景
priority_queue優先級排序O(log n)高優先級任務調度

七、總結

STL 容器為 C++ 開發者提供了開箱即用的數據結構解決方案,掌握各類容器的特性和適用場景是編寫高效代碼的基礎。實際開發中需根據訪問方式、操作頻率、排序需求等因素選型:

  • 需隨機訪問選vector/deque
  • 需有序且高效查找選set/map
  • 需極致查找性能且無序選unordered_*
  • 需特定數據結構行為選適配器(stack/queue等)。

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

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

相關文章

神經網絡 常見分類

&#x1f4da; 神經網絡的常見分類方式可以從不同角度來劃分&#xff0c;以下是幾種主流思路&#xff0c;幫你快速梳理清晰&#xff1a;1?? 按網絡結構分類前饋神經網絡&#xff08;Feedforward Neural Network, FNN&#xff09; 數據從輸入層→隱藏層→輸出層單向傳遞&#…

生產環境Redis緩存穿透與雪崩防護性能優化實戰指南

生產環境Redis緩存穿透與雪崩防護性能優化實戰指南 在當下高并發場景下&#xff0c;Redis 作為主流緩存組件&#xff0c;能夠極大地提升讀寫性能&#xff0c;但同時也容易引發緩存穿透、緩存擊穿及緩存雪崩等問題&#xff0c;導致后端依賴數據庫的請求激增&#xff0c;系統穩定…

【洛谷刷題】用C語言和C++做一些入門題,練習洛谷IDE模式:分支機構(一)

&#x1f525;個人主頁&#xff1a;艾莉絲努力練劍 ?專欄傳送門&#xff1a;《C語言》、《數據結構與算法》、C語言刷題12天IO強訓、LeetCode代碼強化刷題、洛谷刷題、C/C基礎知識知識強化補充、C/C干貨分享&學習過程記錄 &#x1f349;學習方向&#xff1a;C/C方向 ??人…

嵌入式硬件篇---常見的單片機型號

以下是目前常用的單片機型號及其應用場景、優劣勢的詳細解析&#xff0c;結合最新行業動態和技術特性&#xff0c;幫助你精準匹配需求&#xff1a;一、經典 8 位單片機&#xff1a;低成本入門首選1. 51 系列&#xff08;代表型號&#xff1a;AT89C51、STC89C52&#xff09;應用…

windows下ArcGIS 10.8.2下載安裝教程

ArcGIS是由美國環境系統研究所&#xff08;Esri&#xff09;開發的一款功能強大且應用廣泛的綜合性地理信息系統&#xff08;GIS&#xff09;軟件平臺&#xff0c;在空間數據的采集、管理、分析、可視化和共享等方面表現出色&#xff0c;是GIS領域的標桿產品。它擁有豐富的功能…

防御保護15

混合密碼體系 --- 數字信封 邏輯 --- 先用快速的對稱密鑰來對消息進行加密&#xff0c;保證數據的機密性。然后只需要保證對稱密鑰的機密性即可&#xff0c;使用公鑰密鑰體系來對對稱秘鑰消息進行加密。身份認證和數據認證技術 Hash散列 指紋 ---> 單向散列函數 Hash --->…

Linux上管理Java的JDK版本

1.alternatives簡介alternatives是 Linux 系統&#xff08;尤其是 ??RHEL/CentOS/Fedora?? 等基于 RPM 的發行版&#xff09;中用于管理??同一軟件多個版本??的系統工具。它通過維護符號鏈接&#xff08;軟鏈接&#xff09;的層級結構&#xff0c;幫助用戶在不沖突的情…

webrtc編譯arm/arm64

webrtc版本 m125版本 編譯arm sudo apt install gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf //下載失敗,需要多次嘗試 python3 build/linux/sysroot_scripts/install-sysroot.py --arch=arm //python3 bui

【讀論文】醫療AI大模型:百川開源Baichuan-M2

1. 引言 最新百川開源了一個可以和openai新模型掰手腕的醫療垂直大模型:Baichuan-M2在HealthBench基準上取值60.1的高分,超過了gpt-oss-120b。這次一起回顧下百川給的技術報告。 2. Baichuan-M2概覽:“模型+系統” Baichuan-M2的成功源于一套精心設計的、端到端的訓練與優…

OBOO鷗柏丨75寸/86平板企業辦公會議觸控一體機核心國產化品牌招投標參數

OBOO鷗柏整機參數要求&#xff1a;55寸/65寸/75寸/85-86寸/98寸/100寸/110寸/115寸智能會議平板教學觸控一體機/智慧黑板觸摸屏參數要求。系統可靈活選擇如&#xff1a;支持安卓&#xff08;Android&#xff09;&#xff0c;Windows可選擇。并在KylinOS銀河麒麟操作系統、統信U…

DCT域信息隱藏中超參數影響的深度解析:從理論到實踐的完整指南

摘要 隨著數字媒體技術的飛速發展,信息隱藏技術在版權保護、內容認證和隱私保護等領域發揮著越來越重要的作用。離散余弦變換(DCT)域作為信息隱藏的經典載體,因其與JPEG壓縮標準的天然兼容性而備受關注。然而,DCT域信息隱藏的效果很大程度上取決于各種超參數的精心調節,…

YOLOv8環境配置命令

【YOLOv8】一小時掌握&#xff0c;從0開始搭建部署YOLOv8系列教程&#xff0c;安裝推理自定義數據集訓練與搭建_嗶哩嗶哩_bilibili【YOLOv8】一小時掌握&#xff0c;從0開始搭建部署YOLOv8系列教程&#xff0c;安裝推理自定義數據集訓練與搭建共計10條視頻&#xff0c;包括&…

Maven私服配置模版

參考課程: 【黑馬程序員 JavaWeb開發教程】 [https://www.bilibili.com/video/BV1m84y1w7Tb] ZZHow(ZZHow1024)Maven 的 settings.xml 配置文件中&#xff08;從私服下載項目到本地&#xff09; 在 servers 標簽中&#xff0c;配置訪問私服的個人憑證&#xff08;訪問的用戶名和…

《智能體(Agent)速記指南》

《智能體&#xff08;Agent&#xff09;速記指南》 &#x1f4d8; 一句話核心&#xff1a;智能體 會判斷 會用工具&#xff0c;能獨立完成任務的系統。一、智能體到底是什么&#xff1f; ? 一句話定義&#xff1a;能獨立跑完一個完整任務&#xff0c;不用人盯著。 ?? 別搞…

BERT模型引入及詳解

BERT模型引入及詳解 參考 視頻: ELMo 模型&#xff08;雙向 LSTM 模型解決詞向量多義問題 博客&#xff1a; BERT模型BERT詳解&#xff1a;概念、原理與應用一文讀懂BERT ELMo模型 參考: 視頻: ELMo模型&#xff08;雙向LSTM模型解決詞向量多義問題&#xff09; 博客: 【…

開源 Arkts 鴻蒙應用 開發(十六)自定義繪圖控件--波形圖

文章的目的為了記錄使用Arkts 進行Harmony app 開發學習的經歷。本職為嵌入式軟件開發&#xff0c;公司安排開發app&#xff0c;臨時學習&#xff0c;完成app的開發。開發流程和要點有些記憶模糊&#xff0c;趕緊記錄&#xff0c;防止忘記。 相關鏈接&#xff1a; 開源 Arkts …

【linux】自定義shell——bash命令行解釋器小程序

小編個人主頁詳情<—請點擊 小編個人gitee代碼倉庫<—請點擊 linux系列專欄<—請點擊 倘若命中無此運&#xff0c;孤身亦可登昆侖&#xff0c;送給屏幕面前的讀者朋友們和小編自己! 目錄前言一、交互問題&#xff0c;獲取命令行二、字串的分隔問題&#xff0c;解析命…

【Python】Python爬蟲學習路線

文章目錄Python爬蟲學習路線&#xff1a;從入門到實戰的全景指南一、地基&#xff1a;Python核心基礎1. 基礎語法與數據結構2. 面向對象編程&#xff08;OOP&#xff09;3. 正則表達式&#xff08;Regex&#xff09;4. 模塊與包管理二、工具鏈&#xff1a;Python爬蟲核心庫1. 網…

VUE+SPRINGBOOT從0-1打造前后端-前后臺系統-用戶管理

在現代Web應用開發中&#xff0c;前后端分離架構已經成為主流模式。本文將通過一個完整的用戶管理系統案例&#xff0c;詳細介紹如何使用Vue.js Element UI構建前端界面&#xff0c;結合Spring Boot實現后端服務&#xff0c;實現前后端分離開發。該系統包含用戶信息的增刪改查…

基于uni-app+vue3實現的微信小程序地圖范圍限制與單點標記功能實現指南

一、功能概述本文將分步驟講解如何使用uni-app框架在微信小程序中實現以下功能&#xff1a;顯示基礎地圖繪制特定區域范圍&#xff08;以鄭州市為例&#xff09;實現點擊地圖添加標記點限制標記點只能在指定區域內添加顯示選中位置的坐標信息二、分步驟實現步驟1&#xff1a;搭…