C++ 中 vector 的核心用法
·
vector 是 C++ STL 里最常用的动态数组,核心优势是支持随机访问(按索引取值快)、自动扩容,是日常开发中替代普通数组的首选,以下是它的核心用法:
一、基础操作:定义与初始化
这是使用 vector 的第一步,新手要掌握 3 种最常用的初始化方式:
cpp
运行
#include <iostream>
#include <vector> // 必须包含的头文件
using namespace std;
int main() {
// 1. 空vector(最常用)
vector<int> vec1;
// 2. 初始化时指定大小+默认值(值为0)
vector<int> vec2(5); // 5个元素,每个都是0
// 3. 初始化时指定大小+自定义初始值
vector<int> vec3(5, 10); // 5个元素,每个都是10
// 4. 用已有数组/列表初始化(C++11+)
vector<int> vec4 = {1, 2, 3, 4, 5};
return 0;
}
二、核心操作:增删改查(高频)
这是 vector 最核心的使用场景,记住这些就能满足 80% 的需求:
cpp
运行
int main() {
vector<int> vec = {10, 20, 30};
// 1. 新增元素(尾部添加,效率最高)
vec.push_back(40); // vec变为:10,20,30,40
// 2. 删除元素(尾部删除,效率最高)
vec.pop_back(); // vec变回:10,20,30
// 3. 修改元素(随机访问,和数组一样)
vec[1] = 200; // vec变为:10,200,30
// 更安全的修改(会检查索引是否越界)
vec.at(1) = 20; // 改回20,越界会抛异常
// 4. 查找/访问元素
cout << "第一个元素:" << vec.front() << endl; // 10
cout << "最后一个元素:" << vec.back() << endl; // 30
cout << "索引2的元素:" << vec[2] << endl; // 30
// 5. 获取大小
cout << "元素个数:" << vec.size() << endl; // 3
cout << "当前容量(可容纳的元素数):" << vec.capacity() << endl;
return 0;
}
三、进阶操作:遍历与扩容优化
1. 3 种遍历方式(新手优先掌握前两种)
cpp
运行
int main() {
vector<int> vec = {1, 2, 3, 4, 5};
// 方式1:下标遍历(最直观)
for (int i = 0; i < vec.size(); i++) {
cout << vec[i] << " ";
}
cout << endl;
// 方式2:范围for遍历(C++11+,简洁)
for (int num : vec) {
cout << num << " ";
}
cout << endl;
// 方式3:迭代器遍历(适合复杂操作)
for (vector<int>::iterator it = vec.begin(); it != vec.end(); it++) {
cout << *it << " ";
}
cout << endl;
return 0;
}
2. 扩容优化(提升性能)
vector 自动扩容时会重新分配内存、拷贝元素,频繁扩容会降低性能,可提前预留空间:
cpp
运行
int main() {
vector<int> vec;
vec.reserve(100); // 提前预留100个元素的空间
// 后续添加100个元素都不会触发扩容,性能更高
// 清空元素(保留容量,不释放内存)
vec.clear();
cout << "清空后大小:" << vec.size() << endl; // 0
cout << "清空后容量:" << vec.capacity() << endl; // 100
// 释放多余容量(缩容)
vector<int>().swap(vec);
cout << "缩容后容量:" << vec.capacity() << endl; // 0
return 0;
}
四、新手避坑要点
- 索引越界:直接用
vec[i]越界会崩溃,用vec.at(i)会抛异常,调试时优先用at(); - push_back 效率:尾部增删是 O (1)(均摊),中间插入 / 删除是 O (n),如果需要频繁在中间操作,优先用 list;
- 容量≠大小:
size()是实际元素数,capacity()是已分配的内存能容纳的元素数,扩容会让 capacity 翻倍; - 空 vector 访问:空 vector 调用
front()/back()会崩溃,先判断!vec.empty()再访问。
总结
- vector 核心是动态数组,优先用
push_back()/pop_back()增删,用下标 /at()访问; - 遍历优先选下标或范围 for,复杂场景用迭代器;
- 频繁添加元素时用
reserve()预留空间,避免频繁扩容损耗性能; - 避免索引越界,空 vector 先判空再访问首尾元素。
更多推荐

所有评论(0)