1. C++ vector动态数组完全指南
作为C++标准模板库(STL)中最常用的容器之一,vector的动态数组特性使其成为处理可变大小数据集合的首选工具。我在实际开发中发现,90%需要动态扩容数组的场景都可以用vector优雅解决,相比原生数组它提供了自动内存管理、边界检查等关键特性。
vector本质上是一个封装了动态大小数组的类模板,通过连续的存储空间存放元素,支持在O(1)时间复杂度下进行随机访问。当新元素插入导致容量不足时,vector会自动重新分配更大的内存空间(通常是当前容量的2倍),这个过程对使用者完全透明。理解其内部机制可以帮助我们避免常见的性能陷阱。
2. vector核心特性解析
2.1 内存管理机制
vector采用"预留空间+实际使用"的双层管理策略。capacity()返回已分配的内存总量,size()返回实际存储的元素数量。当size超过capacity时触发reallocation,这个操作会导致:
- 分配新的内存块
- 拷贝原有元素到新位置
- 释放旧内存
- 更新内部指针
cpp复制vector<int> v;
cout << v.capacity(); // 初始为0
v.push_back(1); // 触发首次分配
cout << v.capacity(); // 典型实现会分配1
v.push_back(2); // 再次分配(可能变为2)
关键经验:频繁reallocation会严重影响性能,预估大小时应提前用reserve()预留空间
2.2 迭代器失效场景
vector的迭代器本质是原生指针,以下操作会导致迭代器失效:
- 插入元素导致reallocation
- 删除元素使被删元素后的迭代器失效
- swap操作后所有迭代器失效
cpp复制vector<int> v = {1,2,3};
auto it = v.begin();
v.push_back(4); // 可能导致it失效
// 危险操作:cout << *it;
2.3 移动语义支持
C++11后vector支持移动语义,大幅提升了以下场景性能:
- 返回局部vector对象
- 插入临时对象
- swap操作
cp复制
