| 成員函式 | 含義 | 典型值變化 |
|---|---|---|
size() | 當前**實際持有**的元素個數 | push_back +1,pop_back -1,resize 直接設定 |
capacity() | **不重新配置記憶體**可容納的元素上限 | 指數增長(通常 2倍),reserve 手動擴充,shrink_to_fit 釋放多餘 |
vectorv; 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 */
capacity 通常按 2 倍增長(實現細節相關),確保 push_back 攤還 O(1)。capacity 變化(重新配置)會導致所有迭代器、指標、引用失效;size 變化(不重新配置)不會。reserve(n):預先配置至少 n 個元素空間,**不改變 size**,避免頻繁擴容。shrink_to_fit() (C++11):請求釋放多餘容量,**非強制**,實現可忽略。clear():size=0,**保留 capacity**。// 已知大約元素數量:預先 reserve vectorvec; 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 保證釋放記憶體 → ✅ 標準僅「請求」,實現可拒絕。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 的關鍵。