std::vector
的擴容機制是 C++ 容器性能優化的一個核心點。它的判斷標準、行為特征和實現細節如下所示:
? 一、vector 的核心結構
std::vector
內部維護三個指針:
begin -> 指向數據起始位置
end -> 指向當前已使用的元素末尾(size)
capacity_end -> 指向當前分配的內存末尾(capacity)
如果你繼續插入元素導致 end == capacity_end
,即當前內存空間不夠,就會觸發擴容。
? 二、什么時候觸發擴容?
擴容條件:
當 size() >= capacity() 時,再插入元素,就觸發擴容
也就是說:
vector.push_back(x);
如果此時元素個數 == 容量,就會 重新分配更大的內存空間 + 拷貝舊數據過去。
? 三、擴容策略(增長規律)
不同編譯器略有不同,但通常是:
新容量 = 當前容量 * 1.5 ~ 2
例如:
- 初始容量為 0;
- 插入第一個元素后,可能擴為 1;
- 再插入一個元素,擴為 2;
- 再插入一個,擴為 4;
- 然后擴為 8、16、32…(指數增長)
這是為了避免頻繁 realloc(拷貝/移動),提高效率。
? 四、如何手動控制擴容
1. reserve(n)
:預留空間但不改變 size
std::vector<int> vec;
vec.reserve(1000); // 分配容量至少為 1000,避免中途多次擴容
2. resize(n)
:修改 size(實際元素個數)
vec.resize(100); // 改變 vector 的 size,會初始化新元素
? 五、擴容的代價與注意事項
- 重新分配內存(新的更大的空間);
- 拷貝或移動舊元素到新空間;
- 舊空間釋放;
- 所以
vector
的地址在擴容后是可能變化的,原先的指針/引用會失效!
🔴 注意:不要在 vector 擴容后繼續使用原先的指針或引用!
? 六、示例代碼演示
#include <iostream>
#include <vector>int main() {std::vector<int> v;std::cout << "初始 capacity: " << v.capacity() << "\n";for (int i = 0; i < 20; ++i) {v.push_back(i);std::cout << "插入 " << i << ", size: " << v.size() << ", capacity: " << v.capacity() << "\n";}return 0;
}
📌 輸出中你將看到:每隔幾次 push_back
,capacity
就倍增一次。
? 七、總結
項目 | vector 行為說明 |
---|---|
擴容時機 | size >= capacity |
擴容代價 | 重新分配內存 + 拷貝/移動舊元素 |
擴容策略 | 指數增長(一般為 1.5 或 2 倍) |
控制擴容 | reserve(n) 提前分配空間避免多次擴容 |
注意事項 | 擴容后地址可能變化,舊引用/指針可能失效 |