【嵌入式八股2】C++:STL容器與算法

1. STL常見容器及其內部實現的數據結構

序號 名稱 描述 存儲結構 常用方法和操作

1vector動態分配的數組順序數組(array)v.push_back(),?v.pop_back(),?v.insert(),?v.erase(),?v.capacity(),?v.size(),?v.at(idx),?v.front(),?v.back()
2list雙向鏈表離散lt.push_back(),?lt.push_front(),?lt.insert(),?lt.erase(),?lt.sort(),?lt.merge(),?lt.splice()
3stack用?list?或?deque?實現push(),?pop(),?top()
4queue隊列用?list?或?deque?實現push(),?pop(),?front(),?back()
5deque雙端隊列分段連續(多個?vector?連續)d.push_back(),?d.push_front(),?d.pop_back(),?d.pop_front(),?d.insert(),?d.erase()
6priority_queue優先級隊列vectorpush(),?pop(),?top()
7set集合(有序不重復)紅黑樹(弱平衡二叉搜索樹)insert(),?erase(),?find(),?count(),?clear()
8multiset集合(有序可重復)紅黑樹insert(),?erase(),?find(),?count(),?clear()
9unordered_set集合(無序不重復)哈希表insert(),?erase(),?find(),?count(),?clear()
10map鍵值對(有序不重復)紅黑樹insert(),?erase(),?find(),?count(),?clear()
11multimap鍵值對(有序可重復)紅黑樹insert(),?erase(),?find(),?count(),?clear()
12unordered_map鍵值對(無序不重復)哈希表insert(),?erase(),?find(),?count(),?clear()
13hash_map哈希表(類似?map哈希表insert(),?erase(),?find(),?count(),?clear()

2. deque底層數據結構

deque?底層實現通常是分段連續的內存結構,即由多個?vector?組成,允許高效的從兩端進行元素的插入和刪除。

3. 紅黑樹

紅黑樹是一種非嚴格平衡的二叉查找樹,具有自動排序的功能。每個節點存儲一個顏色(紅或黑),并且通過調整樹的結構保持特定的平衡條件,從而保證最壞情況下的查找效率。

4. 常見排序算法

4.1?sort()

  • 適用容器:僅支持隨機訪問的容器,如?vectordequearray
  • 功能:快速排序。
bool func(int a, int b) {return a > b;  // 降序排列
}
sort(vec.begin(), vec.end(), func);  // 對vector進行排序

4.2?partial_sort()

  • 功能:對部分元素進行排序,使用堆排序實現。
  • 參數:排序范圍,默認排序前?n?個元素。
int n = 4;  // 需要排序的元素個數
partial_sort(vec.begin(), vec.begin() + n, vec.end(), func);  // 排序前4個元素

4.3?is_sorted()

  • 功能:檢查容器是否已排序。
  • 返回值:布爾值,true?表示已排序。
bool result = is_sorted(vec.begin(), vec.end(), func);

4.4?is_sorted_until()

  • 功能:返回第一個破壞排序規則的元素位置。
auto it = is_sorted_until(vec.begin(), vec.end(), func);

5. 查找操作

5.1?find()

  • 功能:查找指定元素。
vector<int> vec{10, 20, 30, 40, 50};
auto it = find(vec.begin(), vec.end(), 30);  // 查找30
if (it != vec.end()) {cout << "查找成功:" << *it;
} else {cout << "查找失敗";
}

5.2?find_if()

  • 功能:根據自定義謂詞查找元素。
bool mycomp(int i) {return (i % 2) == 1;  // 查找奇數
}
vector<int> myvector{4, 2, 3, 1, 5};
auto it = find_if(myvector.begin(), myvector.end(), mycomp);

6. 使用?vector?避免頻繁的內存重新分配

vector?在擴容時通常會以 2 倍容量增長,這會導致頻繁的內存分配和元素拷貝。為了優化性能,可以采取以下策略:

6.1 預分配內存

在創建?vector?時,可以使用?reserve()?方法預先分配內存,以減少多次擴容。

6.2 合理選擇初始容量

根據數據的預計大小選擇合適的初始容量,避免不必要的擴容操作。

6.3 優化算法

使用時間復雜度較低的算法,避免在數據量增大時造成性能瓶頸。

7.?vector?的?resize()?與?reserve()

7.1?resize()

  • 功能:調整容器的大小。
  • 效果:如果?n?小于當前大小,則刪除尾部元素;如果?n?大于當前大小,新的元素會被默認構造并添加到尾部。

7.2?reserve()

  • 功能:調整容器的容量,不會改變當前大小。
  • 效果:用于減少擴容次數,確保容器有足夠的內存空間。

8.?vector?擴容原理

  • 擴容過程:每次擴容時,vector?會分配新的內存塊并將現有元素復制到新內存中,舊內存被釋放。
  • 擴容系數:通常情況下,vector?容量每次會翻倍或增加 1.5 倍,這可以減少頻繁的擴容。

8.1 Linux中的內存管理

在Linux系統中,內存區域以2的倍數擴容,以便進行高效的內存分配。

8.2 Windows中的內存管理

在Windows系統中,內存分配通常會增加1.5倍,以便更好地利用已經釋放的內存。

9. 迭代器

迭代器是STL中用于訪問容器元素的一種抽象工具。通過迭代器,容器元素的訪問具有一致的接口,并且可以實現多態。

注意:迭代器只能前進,不能回退。

10. 迭代器失效的情況

迭代器可能會因為容器結構的修改而失效。不同類型的容器失效的情況略有不同:

  • 數組型數據結構(如?vector):insert?和?erase?操作會使插入或刪除點之后的所有迭代器失效。
  • 鏈表型數據結構(如?list):erase?操作只會使指向刪除元素的迭代器失效,其他迭代器不受影響。
  • 樹型數據結構(如?map):erase?操作會使指向刪除元素的迭代器失效,其他迭代器不受影響。?insert?操作不會使任何迭代器失效。

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

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

相關文章

vmcore分析鎖問題實例(x86-64)

問題描述&#xff1a;系統出現panic&#xff0c;dmesg有如下打印&#xff1a; [122061.197311] task:irq/181-ice-enp state:D stack:0 pid:3134 ppid:2 flags:0x00004000 [122061.197315] Call Trace: [122061.197317] <TASK> [122061.197318] __schedule0…

在Apple Silicon上部署Spark-TTS:四大核心庫的技術魔法解析!!!

在Apple Silicon上部署Spark-TTS&#xff1a;四大核心庫的技術魔法解析 &#x1f680; &#xff08;M2芯片實測&#xff5c;Python 3.12.9PyTorch 2.6.0全流程解析&#xff09; 一、核心庫功能全景圖 &#x1f50d; 在Spark-TTS的部署過程中&#xff0c;pip install numpy li…

leetcode03 -- 武漢旅游查詢系統

武漢旅游查詢系統 1 界面展示 1.首頁地圖界面 2.查找功能 在查找框內輸入查找的景點名稱 查找到的景點在地圖上進行定位,右側展示景點的詳細信息。 3.添加景點功能 在地圖上點擊某個位置,系統彈出一個輸入框供用戶填寫景點的名稱和描述。 在彈出的輸入框中輸入景點名…

玩機進階教程----MTK芯片設備刷機導致的死磚修復實例解析 連電腦毫無反應 非硬件問題

在高通芯片機型中,我們可以通過短接主板測試點來激活高通芯片特有的9008底層端口來刷寫救磚固件。但通常MTK芯片類的設備聯機電腦即可觸發深刷模式。但有些例外的情況會導致鏈接電腦毫無反應。遇到類似故障的友友可以參閱此博文嘗試解決。 通過博文了解 1??????-----實…

09-設計模式企業場景 面試題-mk

文章目錄 1.工廠(方法)模式1.1.簡單工廠模式(不是設計模式,是編程習慣)1.2.工廠方法模式(企業開發中最常見)1.3.抽象工廠模式2.策略模式2.1.登錄案例(工廠模式+策略模式)3.責任鏈設計模式4.單點登錄怎么是實現的?5.權限認證是如何實現的6.上傳數據的安全性你們怎么控…

BUUCTF-Web(1-20)

目錄 一.SQL注入 (1)[極客大挑戰 2019]EasySQL 萬能密碼 (7)[SUCTF 2019]EasySQL 堆疊注入 解一&#xff1a; 解二&#xff1a; (10)[強網杯 2019]隨便注 堆疊注入 解一&#xff1a; 解二&#xff1a; 解三&#xff1a; (8)[極客大挑戰 2019]LoveSQL 聯…

軟件包安裝管理Gitlab

官方提供了非常詳盡的系統及自動化腳本安裝教程 Gitlab官網下載地址&#xff1a;https://gitlab.cn/install/ 1、安裝配置 今天我們說一下包安裝管理&#xff0c;這樣方便我們自己更精確的制定符合我們自己需要的Gitlab倉庫 配置&#xff1a;ubuntu2004(focal) 4C8G 下載程…

hadoop執行sqoop任務找不到jar

sqoop:1.4.7 hadoop:3.4.1 數據:oracel-hdfs 2025-04-15 16:57:00,850 INFO sqoop.Sqoop: Running Sqoop version: 1.4.7 2025-04-15 16:57:00,901 WARN tool.BaseSqoopTool: Setting your password on the command-line is insecure. Consider using -P instead. 2025-04-15 …

空地機器人在復雜動態環境下,如何高效自主導航?

隨著空陸兩棲機器人(AGR)在應急救援和城市巡檢等領域的應用范圍不斷擴大&#xff0c;其在復雜動態環境中實現自主導航的挑戰也日益凸顯。對此香港大學王俊銘基于阿木實驗室P600無人機平臺自主搭建了一整套空地兩棲機器人&#xff0c;使用Prometheus開源框架完成算法的仿真驗證與…

MCP調用示例-GitHub倉庫操作

在上一篇文章MCP核心概念和應用 ———AI 大模型的標準化工具箱里&#xff0c;我們講述了MCP的安裝&#xff0c;現在讓我們試一試通過示例了解它的功能吧&#xff01; 首先確保你已經有了相應的APIKEY。 &#x1f4a1;大模型中轉API推薦 ?中轉使用教程 1、點擊界面上的 「Done…

zk源碼—5.請求的處理過程一

大綱 1.服務器的請求處理鏈 (1)Leader服務器的請求處理鏈 一.PrepRequestProcessor請求預處理器 二.ProposalRequestProcessor事務投票處理器 三.SyncRequestProcessor事務日志處理器 四.AckRequestProcessor投票反饋處理器 五.CommitProcessor事務提交處理器 六.ToBeA…

小程序獲取用戶總結(全)

獲取方式 目前小程序獲取用戶一共有3中(自己接觸到的),但由于這個API一直在改,所以不確定后期是否有變動,還是要多關注官方公告。 方式一 使用wx.getUserInfo 實例: wxml 文件<button open-type="getUserInfo" bindgetuserinfo="onGetUserInfo&quo…

[LeetCode 1871] 跳躍游戲 7(Ⅶ)

題面&#xff1a; 數據范圍&#xff1a; 2 ≤ s . l e n g t h ≤ 1 0 5 2 \le s.length \le 10^5 2≤s.length≤105 s [ i ] s[i] s[i] 要么是 ′ 0 ′ 0 ′0′ &#xff0c;要么是 ′ 1 ′ 1 ′1′ s [ 0 ] 0 s[0] 0 s[0]0 1 ≤ m i n J u m p ≤ m a x J u m p <…

【Linux】基礎 IO(文件描述符、重定向、緩沖區)

Linux 1.理解文件2.C文件接口1.打開 寫文件2.讀文件 簡單實現cat命令3.輸出信息到顯示器的方式4.stdin、stdout、stderr5.打開文件的方式 3.系統接口 IO1.傳遞標志位2.open、close3.write、read 4.文件描述符1.是什么&#xff1f;2.分配規則3.重定向原理4.通過dup2系統調用重…

Apache Doris SelectDB 技術能力全面解析

Apache Doris 是一款開源的 MPP 數據庫&#xff0c;以其優異的分析性能著稱&#xff0c;被各行各業廣泛應用在實時數據分析、湖倉融合分析、日志與可觀測性分析、湖倉構建等場景。Apache Doris 目前被 5000 多家中大型的企業深度應用在生產系統中&#xff0c;包含互聯網、金融、…

交換機與路由器的默契配合:它們的聯系與區別

交換機與路由器的默契配合&#xff1a;它們的聯系與區別 一. 交換機與路由器的基本功能1.1 交換機的功能1.2 路由器的功能 二. 交換機和路由器的區別三. 交換機和路由器的聯系3.1 數據轉發的協作3.2 網絡分段與分隔3.3 協同工作提供互聯網接入 四. 交換機和路由器的聯合應用場景…

【計算機系統結構】MIPSsim

目錄 雙擊MIPSsim.exe 問題1&#xff1a;Microsoft Defender SmartScreen阻止了無法是被的應用啟動&#xff0c;運行此應用可能會導致你的電腦存在風險 解決 出現下面的問題的話&#xff0c;建議直接在官網下載 問題2&#xff1a;.NET Framework 3.5安裝錯誤代碼0x80240438 …

map 中key 是否可以放置的自定義的對象?

在 Java 中,可以將自定義對象作為 Map 的 Key,但必須滿足以下條件: 1. 必須正確重寫 hashCode() 和 equals() 方法 原因:Map(如 HashMap)依賴這兩個方法確定鍵的唯一性和存儲位置。未正確重寫的風險: 無法正確查找值:即使兩個對象邏輯上相等,若 hashCode 不同,會被視…

【筆記ing】AI大模型-04邏輯回歸模型

一個神經網絡結構&#xff0c;其中的一個神經網絡層&#xff0c;本質就是一個邏輯回歸模型 深度神經網絡的本質就是多層邏輯回歸模型互相連接或采用一定的特殊連接的方式連接在一起構成的。其中每一個層本質就是一個邏輯回歸模型。 邏輯回歸模型基本原理 邏輯回歸&#xff0…

Android學習總結之算法篇七(圖和矩陣)

有向圖的深度優先搜索&#xff08;DFS&#xff09;和廣度優先搜索&#xff08;BFS&#xff09;的示例&#xff0c;以此來模擬遍歷 GC Root 引用鏈這種有向圖結構&#xff1a; 一、深度優先搜索&#xff08;DFS&#xff09; import java.util.*;public class GraphDFS {privat…