首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C++ 向量容器 capacity 與 size 差異詳解

     編輯:關於C語言

核心概念

成員函式含義典型值變化
size()當前**實際持有**的元素個數push_back +1,pop_back -1,resize 直接設定
capacity()**不重新配置記憶體**可容納的元素上限指數增長(通常 2倍),reserve 手動擴充,shrink_to_fit 釋放多餘

記憶體佈局圖解

vector v;
v.push_back(10);  // size=1, capacity=1
v.push_back(20);  // size=2, capacity=2
v.push_back(30);  // size=3, capacity=4 (擴容)
v.push_back(40);  // size=4, capacity=4
v.push_back(50);  // size=5, capacity=8 (擴容)

/* 記憶體圖示:
[10][20][30][40][50][__][__][__]
 ↑                ↑           ↑
 begin()       end()     end_of_storage()
 size()=5                capacity()=8
*/

關鍵行為差異

  1. 擴容策略:capacity 通常按 2 倍增長(實現細節相關),確保 push_back 攤還 O(1)。
  2. 迭代器失效:capacity 變化(重新配置)會導致所有迭代器、指標、引用失效;size 變化(不重新配置)不會。
  3. reserve(n):預先配置至少 n 個元素空間,**不改變 size**,避免頻繁擴容。
  4. shrink_to_fit() (C++11):請求釋放多餘容量,**非強制**,實現可忽略。
  5. clear():size=0,**保留 capacity**。

效能實戰建議

// 已知大約元素數量:預先 reserve
vector vec;
vec.reserve(10000); // 避免 14 次擴容 (1→2→4→8...→16384)

/* 未 reserve 時擴容次數 log2(10000) ≈ 14
   reserve 後:0 次擴容,效能顯著提升 */

常見誤區

  • ❌ capacity() == size() 才正常 → ✅ 通常 capacity >= size,預留空間是常態。
  • ❌ reserve 後可直接用 operator[] 寫入 → ✅ 仍需 push_back/resize 增加 size。
  • ❌ shrink_to_fit 保證釋放記憶體 → ✅ 標準僅「請求」,實現可拒絕。

原始碼層面(libstdc++ 簡化)

template <typename T, typename Alloc>
class vector {
    T* _M_start;      // 元素起始
    T* _M_finish;     // 已構造元素末尾 (size)
    T* _M_end_of_storage; // 配置空間末尾 (capacity)

public:
    size_type size() const { return _M_finish - _M_start; }
    size_type capacity() const { return _M_end_of_storage - _M_start; }
    // ...
};

理解 size 與 capacity 的分離設計,是寫出高效能 C++ 程式碼、避免迭代器失效 Bug 的關鍵。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved