1. 为什么我们需要vector?
在C++的世界里,数组是最基础的数据结构,但原生数组有个致命缺陷——大小固定。想象你正在开发一个游戏,需要动态管理NPC列表,你无法预知会有多少NPC加入游戏。这时候,vector就像个会自己长大的魔法口袋,完美解决了这个问题。
我十年前刚接触STL时,vector是最让我惊艳的容器。它不仅自动管理内存,还提供了丰富的接口。在实际项目中,vector的使用频率高达70%以上,特别是在需要频繁随机访问的场景。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. vector的核心特性解析
2.1 动态扩容机制
vector最核心的魔法在于它的动态扩容策略。当现有空间不足时,vector会:
- 申请一块更大的内存(通常是原大小的1.5或2倍)
- 将原有元素拷贝到新空间
- 释放旧内存
cpp复制// 典型扩容代码示例
void reserve(size_t n) {
if (n > capacity()) {
T* new_start = alloc.allocate(n);
T* new_finish = uninitialized_copy(start, finish, new_start);
destroy(start, finish); // 析构旧元素
deallocate(); // 释放旧内存
start = new_start;
finish = new_finish;
end_of_storage = start + n;
}
}
重要提示:频繁扩容会导致性能下降。如果预先知道元素数量,应该用reserve()预分配空间
2.2 迭代器失效问题
这是vector最危险的陷阱之一。以下操作会使迭代器失效:
- 插入元素(insert/push_back)
- 删除元素(erase/pop_back)
- 扩容操作(reserve/resize)
cpp复制vector<int> v = {1,2,3};
auto it = v.begin();
v.push_back(4); // 可能导致扩容
*i
