【C++】<STL部分>:STL標準模板庫概要

STL(standard template libaray-標準模板庫),是C++標準庫的重要組成部分,包含了很多常用的數據結構和算法。

在我們學習了模板的之后,再來看STL,就能知道它是C++標準庫中的模板類和模板函數的集合,作為可復用的庫大大提高了程序員的工作效率。

STL主要組成包括:

  • 容器(Containers):封裝各種數據結構,如數組、鏈表、集合等。
  • 算法(Algorithms):提供排序、查找、拷貝、合并等通用算法。
  • 迭代器(Iterators):連接容器與算法的橋梁,用來遍歷容器。
  • 函數對象(Function Objects / Functors):行為像函數的對象,用于定制算法行為。
  • 適配器(Adapters):對已有組件進行封裝,使其接口發生變化(如 stack、queue)。
  • 分配器(Allocators):負責內存分配,通常使用默認的分配器。

概要如下圖所示:

image-20250407200654017

說到STL,就不得不說到泛型編程,這也是上次提到過的一種編程方式。具體可以查看:【C++】Chaper03 函數模板與泛型-CSDN博客

接下來進行幾個部分的大致介紹。

一、STL容器

容器大致分為三類,分別是序列式容器、關聯式容器、無序容器。

1. 序列式容器(Sequence Containers)

保持元素的排列順序。

  • vector:動態數組,支持隨機訪問,尾部插入刪除高效。
  • deque:雙端隊列,頭尾插入刪除都高效。
  • list:雙向鏈表,任意位置插入刪除高效,但不支持隨機訪問。
  • forward_list:C++11引入,單向鏈表。
  • array:定長數組,C++11引入。

2. 關聯式容器(Associative Containers)

自動按鍵排序(通常為紅黑樹實現)。

  • set:鍵的集合,不允許重復。
  • multiset:允許重復鍵。
  • map:鍵值對,鍵唯一。
  • multimap:鍵值對,鍵可重復。

3. 無序容器(Unordered Containers)

基于哈希表實現,C++11 引入。

  • unordered_setunordered_multiset
  • unordered_mapunordered_multimap

二、迭代器(Iterators)

STL中的迭代器類似于指針,用于訪問容器中的元素。

常見迭代器類型:

  • input_iterator:只讀,單向(如 istream_iterator)
  • output_iterator:只寫,單向(如 ostream_iterator)
  • forward_iterator:可讀寫,單向(如 forward_list)
  • bidirectional_iterator:雙向(如 list)
  • random_access_iterator:隨機訪問(如 vector、deque)

三、STL算法(Algorithms)

STL 提供了約 60 多種通用算法,主要分為以下幾類:

  • 非變序算法:不修改原始容器內容(如 findcountfor_each
  • 變序算法:可能會修改容器(如 copyreplaceremove
  • 排序和比較sortstable_sortminmax
  • 數值算法accumulateinner_product(需 #include <numeric>

四、函數對象(Function Objects)

函數對象是重載了 operator() 的類或結構體,可以像函數一樣調用。常用于定制排序規則等。

例如:

struct MyCompare {bool operator()(int a, int b) {return a > b; // 降序}
};std::sort(vec.begin(), vec.end(), MyCompare());

五、適配器(Adapters)

對現有的容器或函數進行封裝,改變其接口。

  • 容器適配器stackqueuepriority_queue
  • 迭代器適配器reverse_iteratorinsert_iterator
  • 函數適配器bindnot1mem_fun(C++11推薦使用 std::bind 和 Lambda)

六、分配器(Allocators)

用于抽象和管理內存的分配與釋放。一般用默認的分配器,但也可以自定義內存管理策略。

標準分配器 std::allocator :

std::allocator 是 C++ 標準庫提供的默認分配器,實現了最基本的內存分配和對象管理功能。其定義位于頭文件 中。主要成員函數包括:

  • allocate:分配未構造的內存。
  • deallocate:釋放先前分配的內存。
  • construct:在已分配的內存上構造對象(C++17 之前)。
  • destroy:調用對象的析構函數(C++17 之前)2。

自定義分配器:

自定義分配器允許開發者控制內存管理策略。例如,可以實現一個內存池分配器,以減少頻繁的內存分配和釋放帶來的開銷。

STL的優點與缺點

STL的優點與缺點

優點:

  • 高效:模板和內聯使得STL非常高效。
  • 通用:一套算法可作用于不同容器。
  • 易用:編寫高質量代碼更容易。

缺點:

  • 編譯慢:模板膨脹嚴重。
  • 錯誤提示晦澀難懂。
  • 可定制性有限(例如自定義內存管理復雜)。

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

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

相關文章

從傳遞函數到PID控制器

在過程控制中&#xff0c;按偏差的比例&#xff08;P&#xff0c;Proportional&#xff09;、積分&#xff08;I&#xff0c;Integral&#xff09;和微分&#xff08;D&#xff0c;Differential&#xff09;進行控制的PID控制器&#xff08;亦稱PID調節器&#xff09;是應用最為…

【PVR Review】《A Review of Palmar Vein Recognition》

[1]張秀峰,牛選兵,王偉,等.掌靜脈識別研究綜述[J].大連民族大學學報,2020,22(01):33-37.DOI:10.13744/j.cnki.cn21-1431/g4.2020.01.007. 文章目錄 1、背景2、手掌靜脈識別方法2.1、傳統手掌靜脈圖像識別方法2.2、基于深度學習的掌靜脈圖像識別 3、手掌靜脈識別難點 1、背景 目…

vector復制耗時

CPP中的vector對象在傳參給子函數時&#xff0c;如果直接傳參&#xff0c;會造成復制給形參的額外耗時 如何解決這個問題呢&#xff1f; 這樣定義局部函數 const vector <int>&vec可以保證傳遞vector對象時使用地址傳遞&#xff0c;并且使用const保證vector不被改變…

算法思想之雙指針

文章目錄 雙指針字符串序列判定字符串所有整數最小和服務交換接口失敗率分析分披薩最多團隊 雙指針 雙指針是指在解決問題時使用兩個指針&#xff0c;通常分別指向數組或字符串中的不同位置&#xff0c;通過移動這兩個指針來解決問題的一種技巧。雙指針技巧常用于解決數組、鏈…

學透Spring Boot — 018. 優雅支持多種響應格式

這是我的專欄《學透Spring Boot》的第18篇文章&#xff0c;想要更系統的學習Spring Boot&#xff0c;請訪問我的專欄&#xff1a;學透 Spring Boot_postnull咖啡的博客-CSDN博客。 目錄 返回不同格式的響應 Spring Boot的內容協商 控制器不用任何修改 啟動內容協商配置 訪…

ngx_os_init

定義在 src\os\unix\ngx_posix_init.c ngx_int_t ngx_os_init(ngx_log_t *log) {ngx_time_t *tp;ngx_uint_t n; #if (NGX_HAVE_LEVEL1_DCACHE_LINESIZE)long size; #endif#if (NGX_HAVE_OS_SPECIFIC_INIT)if (ngx_os_specific_init(log) ! NGX_OK) {return NGX_ERR…

深信服護網藍初面試題

《網安面試指南》https://mp.weixin.qq.com/s/RIVYDmxI9g_TgGrpbdDKtA?token1860256701&langzh_CN 5000篇網安資料庫https://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247486065&idx2&snb30ade8200e842743339d428f414475e&chksmc0e4732df793fa3bf39…

游戲引擎學習第206天

回顧并為當天的工作定下目標 接著回顧了前一天的進展。之前我們做了一些調試功能&#xff0c;并且已經完成了一些基礎的工作&#xff0c;但是還有一些功能需要繼續完善。其中一個目標是能夠展示實體數據&#xff0c;以便在開發游戲邏輯系統時&#xff0c;可以清晰地查看和檢查…

HTML 表單:構建交互式網頁的關鍵元素

HTML 表單:構建交互式網頁的關鍵元素 引言 HTML表單是構建交互式網頁的核心組件之一,它允許用戶與網站進行交互,提交信息、填寫問卷或進行其他操作。本文將深入探討HTML表單的基礎知識、常用元素、表單驗證以及如何優化表單設計,以提高用戶體驗和網站的可訪問性。 HTML表…

Qt音頻采集:QAudioInput詳解與示例

1. 簡介 QAudioInput是Qt Multimedia模塊中用于音頻采集的核心類&#xff0c;能夠從麥克風等輸入設備實時獲取原始音頻數據&#xff08;PCM格式&#xff09;。本文將通過原理講解和代碼示例&#xff0c;幫助開發者快速掌握音頻采集的核心技術。 2. 核心功能 支持多種音頻格式&…

下載安裝Node.js及其他環境

提示&#xff1a;從Node版本降級到Vue項目運行 文章目錄 下載Node.js環境配置配置環境變量 安裝 cnpm&#xff08;我需要安裝&#xff09;安裝腳手架安裝依賴安裝淘寶鏡像&#xff08;注意會更新&#xff09;cnpm vs npm 與新舊版本核心差異包管理器不同功能差異如何選擇&#…

【后端】ORM / ODM

長期不定期更新&#xff0c;建議關注收藏點贊。 概述 ORM&#xff08;Object-Relational Mapping&#xff0c;對象關系映射&#xff09;&#xff1a;面向關系型數據庫&#xff0c;ORM將對象映射到數據庫的表和行&#xff08;例如MySQL、PostgreSQL&#xff09;。ODM&#xff0…

無限滾動(Infinite Scroll)頁面谷歌不收錄!必須改回分頁嗎?

近三年&#xff0c;全球超過58%的網站采用無限滾動設計&#xff08;數據來源&#xff1a;PageTraffic 2023&#xff09; 谷歌官方數據顯示&#xff0c;動態加載內容的索引失敗率高達73%&#xff08;Google Webmaster Report 2022&#xff09;&#xff0c;而采用純無限滾動的頁…

手寫JSX實現虛擬DOM

&#x1f90d; 前端開發工程師、技術日更博主、已過CET6 &#x1f368; 阿珊和她的貓_CSDN博客專家、23年度博客之星前端領域TOP1 &#x1f560; 牛客高級專題作者、打造專欄《前端面試必備》 、《2024面試高頻手撕題》、《前端求職突破計劃》 &#x1f35a; 藍橋云課簽約作者、…

網絡性能優化參數關系解讀 | TCP Nagle / TCP_NODELAY / TCP_QUICKACK / TCP_CORK

注&#xff1a;本文為 “網路性能優化” 相關文章合輯。 未整理去重。 如有內容異常&#xff0c;請看原文。 TCP_NODELAY 詳解 lenky0401 發表于 2012-08-25 16:40 在網絡擁塞控制領域&#xff0c;Nagle 算法&#xff08;Nagle algorithm&#xff09;是一個非常著名的算法&…

玄機-應急響應-webshell查殺

題目要求&#xff1a; 要求獲取四個flag webshell查殺&#xff1a; 常見的webshell&#xff1a; PHP: eval(), system(), exec(), shell_exec(), passthru(), assert(), base64_decode() ASP: Execute(), Eval(), CreateObject() JSP: Runtime.getRuntime().exec() websh…

docker存儲卷及dockers容器源碼部署httpd

1. COW機制 Docker鏡像由多個只讀層疊加而成,啟動容器時,Docker會加載只讀鏡像層并在鏡像棧頂部添加一個讀寫層。 如果運行中的容器修改了現有的一個已經存在的文件,那么該文件將會從讀寫層下面的只讀層復制到讀寫層,該文件的只讀版本依然存在,只是已經被讀寫層中該文件…

PyTorch中卷積層torch.nn.Conv2d

在 PyTorch 中&#xff0c;卷積層主要由 torch.nn.Conv1d、torch.nn.Conv2d 和 torch.nn.Conv3d 實現&#xff0c;分別對應一維、二維和三維卷積操作。以下是詳細說明&#xff1a; 1. 二維卷積 (Conv2d) - 最常用 import torch.nn as nn# 基本參數 conv nn.Conv2d(in_channe…

從 ZStack 獲取物理機與云主機信息并導出 Excel 文件

文章目錄 從 ZStack 獲取物理機與云主機信息并導出 Excel 文件環境zstack 官網客戶端封裝講解 獲取物理機信息講解 獲取云主機信息并關聯物理機講解 導出數據到 Excel 文件講解 運行主程序講解 總結最終文檔效果完整代碼 從 ZStack 獲取物理機與云主機信息并導出 Excel 文件 在…

5.好事多磨 -- TCP網絡連接Ⅱ

前言 第4章節通過回聲服務示例講解了TCP服務器端/客戶端的實現方法。但這僅是從編程角度的學習&#xff0c;我們尚未詳細討論TCP的工作原理。因此&#xff0c;將詳細講解TCP中必要的理論知識&#xff0c;還將給出第4章節客戶端問題的解決方案。 一、回聲客戶端完美實現 第4章…