【C語言基礎】C++ 中的 `vector` 及其 C 語言實現詳解

一、C++ 中的 vector:動態數組的核心特性

1. 基本概念
vector 是 C++ 標準模板庫(STL)中的動態數組容器,支持自動擴容、高效元素訪問和豐富的操作接口。其核心特性包括:

  • 動態內存管理:自動調整容量,避免手動管理內存。
  • 連續存儲:元素在內存中連續存放,支持隨機訪問(時間復雜度 O(1))。
  • 類型安全:通過模板實現,支持任意數據類型。

2. 核心操作

  • 初始化與遍歷
    #include <vector>
    std::vector<int> vec = {1, 2, 3}; // 初始化
    for (int num : vec) { /* 范圍循環 */ }
    
  • 插入與刪除
    vec.push_back(4);    // 尾部插入
    vec.pop_back();      // 尾部刪除
    vec.insert(vec.begin() + 1, 5); // 中間插入
    vec.erase(vec.begin());         // 中間刪除
    
  • 容量管理
    vec.reserve(100);    // 預分配容量
    vec.shrink_to_fit(); // 釋放多余內存
    

3. 性能優化

  • 擴容策略:默認容量翻倍增長,可通過 reserve 減少擴容次數。
  • 移動語義(C++11+):避免深拷貝,提升對象傳遞效率。

4. 適用場景

  • 需要動態調整大小的數組(如讀取未知數量數據)。
  • 高頻隨機訪問元素的場景(如排序、查找)。

二、C 語言實現動態數組(仿 vector

1. 結構設計
通過結構體封裝動態數組的核心參數:

typedef struct {void* data;         // 數據指針size_t size;        // 當前元素數量size_t capacity;    // 分配的總容量size_t elem_size;   // 單個元素大小(字節)
} Vector;

2. 核心功能實現

  • 初始化與銷毀

    Vector vector_init(size_t elem_size, size_t capacity) {Vector vec;vec.elem_size = elem_size;vec.capacity = (capacity > 0) ? capacity : 1;vec.data = malloc(vec.capacity * elem_size);return vec;
    }void vector_destroy(Vector* vec) {free(vec->data);vec->data = NULL;
    }
    
  • 動態擴容

    void vector_resize(Vector* vec, size_t new_capacity) {void* new_data = realloc(vec->data, new_capacity * vec->elem_size);vec->data = new_data;vec->capacity = new_capacity;
    }
    
  • 元素操作

    void vector_push_back(Vector* vec, const void* value) {if (vec->size >= vec->capacity) {vector_resize(vec, vec->capacity * 2); // 容量翻倍}memcpy((char*)vec->data + vec->size * vec->elem_size, value, vec->elem_size);vec->size++;
    }void* vector_at(Vector* vec, size_t index) {return (char*)vec->data + index * vec->elem_size;
    }
    

3. 使用示例

int main() {Vector vec = vector_init(sizeof(int), 2);int a = 10, b = 20;vector_push_back(&vec, &a);vector_push_back(&vec, &b);printf("%d", *(int*)vector_at(&vec, 1)); // 輸出 20vector_destroy(&vec);return 0;
}

三、C++ vector 與 C 實現的對比
特性C++ vectorC 實現
內存管理自動擴容與釋放(RAII)需手動調用 resizedestroy
類型安全模板支持,編譯時類型檢查依賴 void*,需手動類型轉換
功能擴展支持迭代器、STL 算法需自行實現排序、查找等功能
性能優化移動語義、預分配策略需手動優化內存對齊或批量操作
異常處理拋出 std::out_of_range 等異常直接終止程序或返回錯誤碼

四、開發建議
  1. C++ 場景

    • 優先使用 vector,避免重復造輪子。
    • 結合 reserveemplace_back 提升性能。
  2. C 語言場景

    • 封裝內存操作函數(如 vector_push_bulk)減少冗余代碼。
    • 添加邊界檢查宏增強安全性:
      #define VECTOR_SAFE_ACCESS(vec, index) \((index < vec.size) ? vector_at(&vec, index) : NULL)
      
  3. 跨語言協作

    • 在混合編程時,可通過 C 動態數組傳遞數據,再由 C++ 封裝為 vector

五、總結

C++ 的 vector 通過模板和標準庫支持,提供了高效便捷的動態數組操作;而 C 語言需手動實現類似功能,雖靈活性高,但開發成本較大。理解兩者的底層機制,有助于在不同場景下合理選擇數據結構,優化程序性能與可維護性。

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

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

相關文章

nvm切換node版本后,解決npm找不到的問題

解決方法如下 命令行查看node版本 node -v找到node版本所對應的npm版本 點擊進入node版本 npm對應版本下載 點擊進入npm版本 下載Windows 壓縮包 下載完成后&#xff0c;解壓&#xff0c;文件改名為npm 復制到你nvm對應版本的node_modules 下面 將下載的npm /bin 目錄…

數據結構:最小生成樹的普里姆算法和克魯斯卡爾算法

對于一個帶權&#xff08;假設每條邊上的權均為大于零的實數&#xff09;連通無向圖 G 中的不同生成樹&#xff0c;其每棵樹的所有邊上的權值之和也可能不同&#xff1b;圖的所有生成樹中具有邊上的權值之和最小的樹稱為圖的最小生成樹&#xff08;Minimal Spanning Tree&#…

Information-Theoretic Limits of Bistatic Integrated Sensing and Communication

摘要 雙靜態感知指的是發射器&#xff08;照亮目標&#xff09;和感知接收器&#xff08;估計目標狀態&#xff09;在物理上分離的場景&#xff0c;這與發射和感知功能共存的單靜態感知形成對比。在實際場景中&#xff0c;雙靜態感知可能需要應對系統約束&#xff0c;或者作為…

XCTF-web(四)

unserialize3 需要反序列化一下&#xff1a;O:4:“xctf”:2:{s:4:“flag”;s:3:“111”;} php_rce 題目提示rce漏洞&#xff0c;測試一下&#xff1a;?s/Index/\think\app/invokefunction&functioncall_user_func_array&vars[0]phpinfo&vars[1][]1 flag&#xff1…

Java Stream深度解析 高階技巧與性能優化實戰

文章目錄 一、Stream底層機制揭秘1.1 Stream流水線架構1.2 Spliterator探秘 二、自定義收集器高級實現2.1 實現高性能統計收集器2.2 多級分組優化技巧 三、并行流深度優化3.1 并行度控制策略3.2 工作竊取(Work-Stealing)優化 四、無限流與短路操作4.1 生成無限質數流4.2 短路操…

TailwindCss快速上手

什么是Tailwind Css? 一個實用優先的 CSS 框架&#xff0c;可以直接在標記中組合以構建任何設計。 開始使用Tailwind Css 如何安裝 下面是使用vite構建工具的方法 ①安裝 Tailwind CSS: tailwindcss通過tailwindcss/vitenpm安裝。 npm install tailwindcss tailwindcss…

Web前端 (CSS篇)

什么是CSS&#xff1f; css(Cascading Style Sheets)是層疊樣式表或級聯樣式表&#xff0c;是一組設置規則&#xff0c;用于控制web頁面外觀。 為什么使用CSS? CSS 用于定義網頁的樣式&#xff0c;包括針對不同設備和屏幕尺寸的設計和布局。 CSS 實例 body {background-col…

微服務2--服務治理與服務調用

前言 &#xff1a;本文主要闡述微服務架構中的服務治理&#xff0c;以及Nacos環境搭建、服務注冊、服務調用&#xff0c;負載均衡以及Feign實現服務調用。 服務治理 服務治理是微服務架構中最核心最基本的模塊。用于實現各個微服務的自動化注冊與發現。 服務注冊&#xff1a;在…

智能麻將出牌組件

開篇引言? 麻將作為一款風靡全球的策略性游戲&#xff0c;其復雜的規則和多變的牌局給玩家帶來了無盡樂趣。在數字化時代&#xff0c;運用編程技術為麻將游戲賦予智能&#xff0c;實現自動出牌功能&#xff0c;不僅能提升玩家體驗&#xff0c;還能深入探索算法在博弈游戲中的…

“大灣區珠寶藝境花園”璀璨綻放第五屆消博會

2025年4月13日&#xff0c;第五屆中國國際消費品博覽會&#xff08;以下簡稱"消博會"&#xff09;重要主題活動——《大灣區珠寶藝境花園》啟動儀式在海南國際會展中心2號館隆重舉行。由廣東省金銀珠寶玉器業廠商會組織帶領粵港澳大灣區優秀珠寶品牌&#xff0c;以“…

基于前端技術的QR碼API開發實戰:從原理到部署

前言 QR碼&#xff08;Quick Response Code&#xff09;是一種二維碼&#xff0c;于1994年開發。它能快速存儲和識別數據&#xff0c;包含黑白方塊圖案&#xff0c;常用于掃描獲取信息。QR碼具有高容錯性和快速讀取的優點&#xff0c;廣泛應用于廣告、支付、物流等領域。通過掃…

利用耦合有限元和神經網絡計算的骨重塑模擬多尺度方法

Multiscale methodology for bone remodelling simulation using coupled finite element and neural network computation 摘要&#xff1a;本文旨在開發一種基于有限元分析&#xff08;FEA&#xff09;和神經網絡&#xff08;NN&#xff09;計算的多尺度分層混合模型&#xf…

使用異步特征引發的錯誤error[E0195]: lifetime parameters or bounds on method `before_save`

問題描述&#xff1a; 使用SeaOrm保存實體到數據庫時不想每次都設置更新時間&#xff0c;所以想通過實現ActiveModelBehavior在保存實體前統一設置更新時間 impl ActiveModelBehavior for ActiveModel {async fn before_save<C>(self, _db: &C, _insert: bool) -&…

TVS管與ESD保護二極管詳解:原理、區別與應用選型

一、TVS管&#xff08;瞬態電壓抑制二極管&#xff09; 1. 基本定義 TVS管&#xff08;Transient Voltage Suppressor&#xff09; 是一種用于抑制瞬態高壓脈沖的半導體器件&#xff0c;通過雪崩擊穿效應快速鉗位電壓&#xff0c;保護后端電路。 2. 核心特性參數 參數定義公…

Day08 【基于jieba分詞實現詞嵌入的文本多分類】

基于jieba分詞的文本多分類 目標數據準備參數配置數據處理模型構建主程序測試與評估測試結果 目標 本文基于給定的詞表&#xff0c;將輸入的文本基于jieba分詞分割為若干個詞&#xff0c;然后將詞基于詞表進行初步編碼&#xff0c;之后經過網絡層&#xff0c;輸出在已知類別標…

入門-C編程基礎部分:6、常量

飛書文檔https://x509p6c8to.feishu.cn/wiki/MnkLwEozRidtw6kyeW9cwClbnAg C 常量 常量是固定值&#xff0c;在程序執行期間不會改變&#xff0c;可以讓我們編程更加規范。 常量可以是任何的基本數據類型&#xff0c;比如整數常量、浮點常量、字符常量&#xff0c;或字符串字…

第二階段:數據結構與函數

模塊4&#xff1a;常用數據結構 (Organizing Lots of Data) 在前面的模塊中&#xff0c;我們學習了如何使用變量來存儲單個數據&#xff0c;比如一個數字、一個名字或一個布爾值。但很多時候&#xff0c;我們需要處理一組相關的數據&#xff0c;比如班級里所有學生的名字、一本…

【C++算法】61.字符串_最長公共前綴

文章目錄 題目鏈接&#xff1a;題目描述&#xff1a;解法C 算法代碼&#xff1a;解釋 題目鏈接&#xff1a; 14. 最長公共前綴 題目描述&#xff1a; 解法 解法一&#xff1a;兩兩比較 先算前兩個字符串的最長公共前綴&#xff0c;然后拿這個最長公共前綴和后面一個來比較&…

JVM 調優不再難:AI 工具自動生成內存優化方案

在 Java 應用程序的開發與運行過程中&#xff0c;Java 虛擬機&#xff08;JVM&#xff09;的性能調優一直是一項極具挑戰性的任務&#xff0c;尤其是內存優化方面。不合適的 JVM 內存配置可能會導致應用程序出現性能瓶頸&#xff0c;甚至頻繁拋出內存溢出異常&#xff0c;影響業…

紛析云開源財務軟件:企業財務數字化轉型的靈活解決方案

紛析云是一家專注于開源財務軟件研發的公司&#xff0c;自2018年成立以來&#xff0c;始終以“開源開放”為核心理念&#xff0c;致力于通過技術創新助力企業實現財務管理的數字化與智能化轉型。其開源財務軟件憑借高擴展性、靈活部署和全面的功能模塊&#xff0c;成為眾多企業…