
🏝️专栏: 【C++修炼之路】
🌅主页: f狐o狸x
"山高路远,你比想象中更耐造"
目录
[一、vector 是什么?](#一、vector 是什么?)
[三、vector 核心基本用法](#三、vector 核心基本用法)
[3.1. 初始化(最常用的 5 种方式)](#3.1. 初始化(最常用的 5 种方式))
[3.2. 元素访问(4 种常用方式)](#3.2. 元素访问(4 种常用方式))
[3.3. 元素的添加与删除](#3.3. 元素的添加与删除)
[3.4. 容量与大小(核心属性)](#3.4. 容量与大小(核心属性))
[3.5. 遍历 vector(3 种常用方式)](#3.5. 遍历 vector(3 种常用方式))
[四、vector 常见注意事项](#四、vector 常见注意事项)
在 C++ 编程中,数组是存储一组相同类型数据的基础容器,但普通数组的长度固定、扩容麻烦,而vector作为 STL(标准模板库)中最常用的动态数组容器,完美解决了这些问题。本文将从零基础角度,全面讲解 vector 的基本用法,帮助新手快速上手。
一、vector 是什么?
vector是 C++ STL 中的顺序容器,本质是动态数组------ 它的大小可以根据需要自动增长或缩减,无需像普通数组那样提前固定长度。同时,vector 保留了数组随机访问效率高的优点,是日常开发中最常用的容器之
二、基础准备:头文件与命名空间
使用 vector 前,必须包含对应的头文件,且建议使用std命名空间:
cpp
// 核心头文件,必须包含
#include <vector>
// 输入输出头文件(示例中会用到)
#include <iostream>
// 简化代码,避免每次写std::vector
using namespace std;
三、vector 核心基本用法
3.1. 初始化(最常用的 5 种方式)
vector 的初始化方式灵活,新手优先掌握以下 5 种:
cpp
int main() {
// 方式1:空vector(最常用)
vector<int> vec1;
// 方式2:初始化时指定长度,元素默认值为0
vector<int> vec2(5); // 长度为5,元素:[0,0,0,0,0]
// 方式3:指定长度+初始值
vector<int> vec3(5, 10); // 长度为5,元素:[10,10,10,10,10]
// 方式4:用已有数组/列表初始化(C++11及以上)
vector<int> vec4 = {1, 2, 3, 4, 5}; // 元素:[1,2,3,4,5]
// 方式5:用另一个vector初始化
vector<int> vec5(vec4); // 复制vec4,元素:[1,2,3,4,5]
return 0;
}
3.2. 元素访问(4 种常用方式)
vector 支持多种访问方式,按需选择:
cpp
int main() {
vector<int> vec = {10, 20, 30, 40, 50};
// 方式1:下标访问(和普通数组一样,无越界检查)
cout << "下标访问vec[2]:" << vec[2] << endl; // 输出30
// 方式2:at()访问(有越界检查,更安全)
cout << "at()访问vec.at(3):" << vec.at(3) << endl; // 输出40
// 方式3:访问第一个/最后一个元素
cout << "第一个元素:" << vec.front() << endl; // 输出10
cout << "最后一个元素:" << vec.back() << endl; // 输出50
// 方式4:获取底层数组指针(进阶,了解即可)
int* ptr = vec.data();
cout << "通过指针访问第一个元素:" << *ptr << endl; // 输出10
return 0;
}
注意 :下标访问(vec[i])速度快,但越界时会直接崩溃;at(i)会做越界检查,越界时抛出out_of_range异常。
3.3. 元素的添加与删除
vector 的动态性核心体现在元素的增删,掌握以下核心方法:
cpp
int main() {
vector<int> vec = {1, 2, 3};
// 3.1 尾部添加元素(最常用)
vec.push_back(4); // 尾部加4,vec:[1,2,3,4]
vec.emplace_back(5); // C++11新增,效率更高的尾部添加,vec:[1,2,3,4,5]
// 3.2 指定位置插入元素(迭代器方式)
// 在第2个元素(下标1)前插入10,vec:[1,10,2,3,4,5]
vec.insert(vec.begin() + 1, 10);
// 3.3 尾部删除元素
vec.pop_back(); // 删除最后一个元素5,vec:[1,10,2,3,4]
// 3.4 指定位置删除元素
// 删除第2个元素(下标1),vec:[1,2,3,4]
vec.erase(vec.begin() + 1);
// 3.5 清空所有元素(size变为0,capacity不变)
// vec.clear();
// 打印最终结果:1 2 3 4
for (int num : vec) {
cout << num << " ";
}
return 0;
}
关键区别 :push_back是先构造元素再拷贝,emplace_back是直接在 vector 尾部构造元素,效率更高,C++11 及以上优先用emplace_back。
3.4. 容量与大小(核心属性)
vector 的size(实际元素个数)和capacity(已分配的内存空间能容纳的元素个数)是容易混淆的概念,示例说明:
cpp
int main() {
vector<int> vec;
// 初始状态:size=0,capacity=0
cout << "初始 size:" << vec.size() << ",capacity:" << vec.capacity() << endl;
// 添加元素,观察size和capacity变化
for (int i = 0; i < 5; i++) {
vec.emplace_back(i);
cout << "添加第" << i+1 << "个元素后:size=" << vec.size()
<< ",capacity=" << vec.capacity() << endl;
}
// 调整size(扩容补0,缩容删除尾部元素)
vec.resize(8); // size变为8,capacity不变,新增元素为0
cout << "resize(8)后:size=" << vec.size() << ",capacity=" << vec.capacity() << endl;
// 预留容量(提前分配内存,避免频繁扩容)
vec.reserve(20); // capacity变为20,size不变
cout << "reserve(20)后:size=" << vec.size() << ",capacity=" << vec.capacity() << endl;
// 判断是否为空
if (!vec.empty()) {
cout << "vector不为空" << endl;
}
return 0;
}
程序运行结果:

核心结论:
size():返回当前 vector 中实际的元素个数;capacity():返回当前分配的内存能容纳的元素个数;reserve(n):提前分配能容纳 n 个元素的内存,避免频繁扩容(提升性能);resize(n):调整实际元素个数为 n,不足补默认值,超出则删除尾部元素
3.5. 遍历 vector(3 种常用方式)
遍历是使用 vector 的高频操作,掌握以下 3 种即可:
cpp
int main() {
vector<int> vec = {10, 20, 30, 40, 50};
// 方式1:普通for循环(下标遍历)
cout << "普通for循环遍历:";
for (int i = 0; i < vec.size(); i++) {
cout << vec[i] << " ";
}
cout << endl;
// 方式2:范围for循环(C++11及以上,最简洁)
cout << "范围for循环遍历:";
for (int num : vec) {
cout << num << " ";
}
cout << endl;
// 方式3:迭代器遍历(STL容器通用方式)
cout << "迭代器遍历:";
for (vector<int>::iterator it = vec.begin(); it != vec.end(); it++) {
cout << *it << " ";
}
cout << endl;
return 0;
}
程序运行结果:

推荐:日常开发优先用范围 for 循环(简洁),需要修改迭代器位置时用迭代器遍历。
四、vector 常见注意事项
- 越界访问 :避免使用
vec[i]访问超出size()-1的下标,优先用at(); - 迭代器失效:插入 / 删除元素可能导致迭代器失效,操作后需重新获取迭代器;
- 性能优化 :如果提前知道元素个数,用
reserve()预留容量,减少扩容次数; - 内存释放 :
clear()仅清空元素,不释放内存;若需释放内存,可使用vec.swap(vector<int>())。
五、总结
vector 作为 C++ 最核心的容器之一,核心优势是动态扩容 + 随机访问高效,新手需重点掌握:
- 初始化的 5 种常用方式,尤其是空初始化和列表初始化;
- 元素访问优先用
at()(安全)、front()/back()(便捷); - 增删元素优先用
emplace_back()(尾部添加)、pop_back()(尾部删除); - 区分
size()(实际元素数)和capacity()(内存容量),合理使用reserve()优化性能。
掌握以上内容,就能满足日常开发中 90% 的 vector 使用场景。后续可进一步学习 vector 的排序、查找、排序等进阶用法,逐步吃透这个核心容器。
都看到这里啦,留下你滴三连吧~
