手撕算法之`vector` 擴容、`string` 分割、鏈表翻轉

手寫常見操作:vector 擴容、string 分割、鏈表翻轉

(一)vector擴容

在 C++ 中,vector 的擴容機制是動態數組實現的核心特性,直接關系到性能和內存使用效率。以下是深入剖析:


1. 擴容觸發條件

vector<int> v;
v.push_back(1);  // 當 size() == capacity() 時觸發擴容
  • 當插入新元素時,若當前元素數量 size() 等于容量 capacity(),則觸發擴容

2. 擴容算法核心步驟

// 偽代碼邏輯
void push_back(const T& value) {if (size == capacity) { // 需要擴容new_cap = max(2 * capacity, 1); // 典型增長策略new_data = allocate(new_cap);    // 1. 申請新內存copy_or_move(old_data, new_data); // 2. 遷移數據deallocate(old_data);            // 3. 釋放舊內存}// 插入新元素...
}

3. 關鍵特性與復雜度分析

(1) 擴容因子(Growth Factor)
編譯器實現擴容策略數學證明最優性
GCC2 倍擴容(常見)分攤 O(1) 時間復雜度
MSVC1.5 倍擴容更好內存利用率
(2) 時間復雜度
  • 單次 push_back:最壞 O(n)(觸發擴容時)
  • 均攤時間復雜度:O(1)(通過分攤分析證明)

4. 擴容過程可視化

vector<int> v;
// 初始狀態: capacity=0, size=0v.push_back(1); // 第1次擴容 → capacity=1
v.push_back(2); // 第2次擴容 → capacity=2
v.push_back(3); // 第3次擴容 → capacity=4
v.push_back(4); // 無需擴容
v.push_back(5); // 第4次擴容 → capacity=8

5. 性能優化技巧

(1) 預分配內存
vector<int> v;
v.reserve(1000); // 直接分配足夠容量,避免多次擴容
(2) 移動語義優化(C++11+)
class BigObject {
public:BigObject(BigObject&& other) noexcept; // 移動構造函數
};vector<BigObject> v;
v.push_back(BigObject()); // 觸發移動而非拷貝

6. 不同編譯器的擴容策略

通過代碼驗證不同編譯器的擴容行為:

vector<int> v;
size_t last_cap = 0;for (int i = 0; i < 100; ++i) {v.push_back(i);if (v.capacity() != last_cap) {cout << "Size: " << v.size() << ", New Capacity: " << v.capacity() << endl;last_cap = v.capacity();}
}
  • GCC 輸出:1 → 2 → 4 → 8 → 16 → 32 → 64 → 128…
  • MSVC 輸出:1 → 2 → 3 → 4 → 6 → 9 → 13 → 19…

7. 擴容時的元素遷移

  • 拷貝語義:調用元素的拷貝構造函數(深拷貝)
  • 移動語義(C++11+):優先調用移動構造函數(高效)

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

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

相關文章

鴻蒙NEXT開發問題大全(不斷更新中.....)

目錄 問題1&#xff1a;鴻蒙NEXT獲取華為手機的udid ?問題2&#xff1a;[Fail]ExecuteCommand need connect-key? 問題3&#xff1a;測試時如何安裝app包 問題1&#xff1a;鴻蒙NEXT開發獲取華為手機的udid hdc -t "設備的序列號" shell bm get --udid 問題2&…

LiteratureReading:[2016] Enriching Word Vectors with Subword Information

文章目錄 一、文獻簡明&#xff08;zero&#xff09;二、快速預覽&#xff08;first&#xff09;1、標題分析2、作者介紹3、引用數4、摘要分析&#xff08;1&#xff09;翻譯&#xff08;2&#xff09;分析 5、總結分析&#xff08;1&#xff09;翻譯&#xff08;2&#xff09;…

ZMC600E,多核異構如何成就機器人精準控制?

ZMC600E主站控制器憑借其多核異構處理器的強大性能&#xff0c;實現了高算力與高實時性的完美平衡&#xff0c;讓機器人動作流暢、精準無誤。接下來&#xff0c;讓我們深入了解其內核結構的奧秘。 在ZMC600E主站控制器控制機器人的時候&#xff0c;可以精準的控制機器人執行各種…

一文掌握 PostgreSQL 的各種指令(PostgreSQL指令備忘)

引言 PostgreSQL 作為一款功能強大、開源的關系型數據庫管理系統&#xff08;RDBMS&#xff09;&#xff0c;以其高擴展性、SQL 標準兼容性以及豐富的功能特性&#xff0c;成為企業級應用的首選數據庫之一。無論是開發、運維還是數據分析&#xff0c;掌握 PostgreSQL 的核心指…

fastadmin后臺管理員日志指定方法不記錄

做的訂單提醒,只要在線會把日志自動存儲進去,這個又是每30s執行一次,數據庫沒多久就爆掉了,最終找到一個處理方法,可能不是最好的,僅供大家參考 具體位置: application/admin/model/AdminLog.php里面的$ignoreRegex方法 protected static $ignoreRegex [/^(.*)\/(selectpage…

Redis Sentinel(哨兵模式)高可用性解決方案

一、概述 Redis Sentinel&#xff08;哨兵模式&#xff09;是Redis的高可用性&#xff08;High Availability, HA&#xff09;解決方案&#xff0c;它通過哨兵系統和Redis實例的協同工作&#xff0c;確保了Redis服務的高可用性和數據的持久性。哨兵系統由一個或多個哨兵進程組…

密碼學(Public-Key Cryptography and Discrete Logarithms)

Public-Key Cryptography and Discrete Logarithms Discrete Logarithm 核心概念&#xff1a;離散對數是密碼學中一個重要的數學問題&#xff0c;特別是在有限域和循環群中。它基于指數運算在某些群中是單向函數這一特性。也就是說&#xff0c;給定一個群 G G G和一個生成元 …

tcp 通信在wifi 下會出現內容錯誤嗎?

TCP通信在WiFi下可能會出現內容錯誤。TCP&#xff08;Transmission Control Protocol&#xff0c;傳輸控制協議&#xff09;是一種面向連接的、可靠的、基于字節流的傳輸層通信協議。在WiFi環境下&#xff0c;由于信號干擾、信號衰減、多徑傳播等因素&#xff0c;可能會造成數據…

JVM OOM問題如何排查和解決

在 Java 開發中&#xff0c;JVM OOM&#xff08;OutOfMemoryError&#xff09;問題通常是指程序運行時&#xff0c;JVM 無法為對象分配足夠的內存空間&#xff0c;導致發生內存溢出的錯誤。這個問題往往和內存的配置、內存泄漏、或者資源過度使用等因素有關。 1. OOM 錯誤類型…

深入解析音頻編解碼器(Audio CODEC):硬件、接口與驅動開發

音頻編解碼器&#xff08;Audio CODEC&#xff09;是音頻處理系統中的核心組件&#xff0c;負責 模擬信號與數字信號的相互轉換&#xff0c;廣泛應用于 智能音箱、嵌入式系統、消費電子產品 等設備。本篇文章將從 硬件結構、接口解析、驅動開發 和 軟件配置 等方面&#xff0c;…

【QGIS_Python】在QGIS的Python控制臺生成SHP格式點數據并顯示標注

參考文章&#xff1a; 「GIS教程」使用DeepSeek輔助QGIS快速制圖 | 麻辣GIS 示例代碼說明&#xff1a;使用參考文章中的省會城市坐標點&#xff0c;左側增加一列城市序號code, 圖層標注顯示 code 城市名稱&#xff0c;同時在指定路徑下生成對應SHP格式點數據。 import os fr…

deepSpeed多機多卡訓練服務器之間,和服務器內兩個GPU是怎么通信

DeepSpeed 在多機多卡訓練時,主要依賴 NCCL 和 PyTorch Distributed 進行通信。具體來說,分為服務器之間和服務器內兩種情況: 1. 服務器之間的通信(跨節點通信) DeepSpeed 采用 NCCL(NVIDIA Collective Communications Library)作為主要的通信后端,結合 PyTorch Distr…

k8s-coredns-CrashLoopBackOff 工作不正常

本文作者&#xff1a; slience_me 問題描述 # 問題描述 # rootk8s-node1:/home/slienceme# kubectl get pods --all-namespaces # NAMESPACE NAME READY STATUS RESTARTS AGE # kube-flannel kube-flannel-ds-66bcs …

新能源電站系統建設提速!麒麟信安操作系統驅動光伏風電雙領域安全升級

在全球能源結構加速向清潔能源轉型的背景下&#xff0c;新能源電站建設正如火如荼地展開&#xff0c;麒麟信安操作系統為光伏與風電領域提供了穩定可靠的底座支持&#xff0c;目前已在中電乾陽光伏、遼寧鐵嶺風電場、清河光伏、鑫田茨溝風電場、連山風電場等新能源場站落地應用…

Oracle 19c 子分區表索引測試

一、建表語句放在最后&#xff0c;方便查看 二、創建各類索引 --創建本地的主鍵約束&#xff0c;但必須加上分區鍵、子分區鍵MT_O_CODE,M_YMD alter table MS_DMG.A_RED drop constraint MGR_PK_AREAD ; alter table MS_DMG.A_RED add constraint MGR_PK_AREAD primary key …

Linux Vim 寄存器 | 從基礎分類到高級應用

注&#xff1a;本文為 “vim 寄存器” 相關文章合輯。 英文引文&#xff0c;機翻未校。 中文引文&#xff0c;略作重排。 未整理去重&#xff0c;如有內容異常&#xff0c;請看原文。 Registers 寄存器 Learning Vim registers is like learning algebra for the first ti…

【Java/數據結構】隊列(Quque)

本博客將介紹隊列的相關知識&#xff0c;包括基于數組的普通隊列&#xff0c;基于鏈表的普通隊列&#xff0c;基于數組的雙端隊列&#xff0c;基于鏈表的雙端隊列&#xff0c;但不包括優先級隊列&#xff08;PriorityQueue&#xff09;&#xff0c;此數據結構將單獨發一篇博客&…

[數據結構]排序之 歸并排序(有詳細的遞歸圖解)

一、非遞歸 基本思想&#xff1a; 歸并排序&#xff08; MERGE-SORT &#xff09;是建立在歸并操作上的一種有效的排序算法 , 該算法是采用分治法&#xff08; Divide andConquer&#xff09;的一個非常典型的應用。將已有序的子序列合并&#xff0c;得到完全有序的序列&#x…

docker安裝向量數據庫Milvus及可視化工具 Attu

前置條件 1.安裝了docker 2.服務器網絡正常&#xff0c;可以連接到容器下載地址 3.服務器磁盤空間正常&#xff0c;docker磁盤占用過大&#xff0c;請參考docker容量占用過大解決辦法 一、下載yml文件 可在文章資源下載或者自行下載&#xff1a;下載yml 下載這個單機版本的…

科技云報到:AI Agent打了個響指,商業齒輪加速轉動

科技云報到原創。 3月16日&#xff0c;百度旗下文心大模型4.5和文心大模型X1正式發布。目前&#xff0c;兩款模型已在文心一言官網上線&#xff0c;免費向用戶開放。 同時&#xff0c;文心大模型4.5已上線百度智能云千帆大模型平臺&#xff0c;企業用戶和開發者登錄即可調用AP…