Vector作为C++标准模板库(STL)中最常用的序列容器之一,其动态数组特性在内存管理和数据操作方面具有独特优势。本文将通过一个完整示例代码,深入剖析vector的核心操作,并揭示其底层实现原理。文章包含4000余字详细解析,适合进阶开发者系统学习。
#include
using namespace std;
cpp
#include
#include
using namespace std;
#define arr_size 10
int main() {
vector arr;
// 初始化操作(下文详解)
for (int i = 0; i < arr_size; i++) {
arr.push_back(i + 1);
}
// 元素操作与迭代器管理
// ...(中间操作代码)
// 最终输出
for (int x : arr) {
cout<< x << " ";
}
cout << endl;
return 0;
}
cpp
vector arr; // 创建空vector
#define arr_size 10 // 定义初始容量
for (int i=0; i
关键点:
[1,2,3,4,5,6,7,8,9,10]
cpp
int size = arr.size(); // 获取逻辑大小(返回10)
int a = arr.at(1); // 安全访问(返回2,越界抛出异常)
arr[1] = 20; // 直接访问(不检查边界)
区别说明:
at()
进行边界检查,安全性高但性能略低operator[]
无检查,适用于已知安全的场景cpp
arr.push_back(11); // 尾部插入11(size=11)
arr.pop_back(); // 删除尾部元素(size=10)
容量变化规律:
cpp
auto begin_it = arr.begin(); // 随机访问迭代器(支持+-操作)
auto end_it = arr.end(); // 尾后位置(不可解引用)
迭代器特性:
++
/--
/+n
/-n
操作vector::iterator
cpp
auto last_it = prev(end_it, 1); // 获取最后一个元素迭代器
auto it = arr.begin();
advance(it, -1); // 相当于--it(此时指向begin前的无效位置)
advance(it, 1); // 回到初始位置
注意事项:
cpp
arr.insert(begin_it, 0); // 在头部插入元素0
底层机制:
插入后状态:
[0,1,2,3,4,5,6,7,8,9,10](size=11,capacity≥20)
cpp
// 获取最新尾部迭代器
begin_it = arr.begin();
end_it = arr.end();
last_it = prev(end_it, 1);
arr.insert(last_it, 11); // 在倒数第二个位置插入11
执行效果:
插入前: [0,1,2,3,4,5,6,7,8,9,10]
插入后: [0,1,2,3,4,5,6,7,8,11,9,10]
cpp
arr.erase(begin_it); // 删除首元素0
性能分析:
cpp
bool if_not = arr.empty(); // 检查是否为空(false)
arr.clear(); // 清空所有元素(size=0,capacity不变)
重要区别:
操作序列 | 状态变化 | 容量变化 |
---|---|---|
初始化 | [1,2,...,10] | 16(典型实现) |
insert头部 | [0,1,...,10] | 32 |
insert尾部前 | [0,1,...,10,11] | 32 |
erase首元素 | [1,2,...,10,11] | 32 |
1 2 3 4 5 6 7 8 9 10 11
cpp
vector arr;
arr.reserve(arr_size * 2); // 预分配20个元素空间
优势:
cpp
// 优于insert(0, x)
arr.push_back(x); // O(1)摊销时间
arr.insert(arr.begin(), x); // O(n)时间复杂度
cpp
for(auto it=arr.begin(); it!=arr.end(); ++it) {
if(*it % 2 == 0) {
arr.erase(it); // 导致迭代器失效
}
}
正确做法:
cpp
arr.erase(remove_if(arr.begin(), arr.end(),
[](int x){ return x%2 == 0; }), arr.end());
cpp
// 非线程安全的操作
void unsafe_operation(vector& vec) {
auto it = vec.begin();
vec.push_back(100); // 可能导致it失效
*it = 200; // 未定义行为
}
解决方案:
特性 | vector | list | deque |
---|---|---|---|
随机访问 | O(1) | O(n) | O(1) |
中间插入/删除 | O(n) | O(1) | O(n) |
内存连续性 | 是 | 否 | 是(分段连续) |
缓存友好性 | 高 | 低 | 中 |
本文通过完整代码示例,系统讲解了vector的核心操作与底层机制。理解这些内容对以下方面具有重要意义:
随着C++标准的发展,vector持续增强功能(如C++11的emplace_back)。建议开发者结合具体场景,在vector、list、deque等容器中做出最优选择。