1. 为什么每个C++开发者都需要掌握vector
在C++标准库的容器家族中,vector就像瑞士军刀一样不可或缺。作为动态数组的终极实现,它完美平衡了内存效率与操作便利性。我见过太多初级开发者还在手动管理原生数组,每次看到new[]和delete[]的显式调用就头皮发麻——这简直是在给自己埋雷。
vector的底层实现是一块连续内存空间,这意味着它保留了原生数组的缓存友好特性。但与裸数组不同,它能自动处理内存扩容,当现有容量不足时,vector会按照特定策略(通常是2倍或1.5倍)重新分配更大空间。这个特性让vector在需要频繁增删元素的场景下依然能保持高效。
关键认知:vector的
size()表示当前元素数量,capacity()才是实际分配的内存容量。两者差值就是无需重新分配内存还能添加的元素数量。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. vector核心操作全图解
2.1 创建与初始化vector的7种姿势
cpp复制// 1. 默认构造 - 空vector
vector<int> v1;
// 2. 指定初始大小(元素默认初始化)
vector<string> v2(5); // 5个空字符串
// 3. 指定大小和初始值
vector<double> v3(10, 3.14); // 10个3.14
// 4. 通过迭代器范围初始化
int arr[] = {1,3,5,7};
vector<int> v4(begin(arr), end(arr));
// 5. 列表初始化 (C++11)
vector<char> v5 = {'a', 'e', 'i', 'o', 'u'};
// 6. 拷贝构造
vector<int> v6(v4);
// 7. 移动构造 (C++11)
vector<int> v7(std::move(v6)); // v6现在为空
实际项目中,我常用第3种和第5种方式。特别是列表初始化,代码意图一目了然。注意第7种的移动构造会"掏空"原vector,这在转移大型数据时能避免不必要的拷贝。
2.2 元素访问的5种方式与安全边界
cpp复制vector<int> nums = {10,20,30};
// 1. 下标访问 - 不检查越界
int x =
