一、前言
普通数组长度固定,运行时无法扩容,vector 是 STL 动态数组,自动扩容、支持任意增删元素,兼容普通数组下标访问,是最常用容器。使用头文件<vector>。
二、vector 五种初始化方式
cpp
运行
#include <iostream>
#include <vector>
using namespace std;
int main()
{
// 1. 空容器
vector<int> v1;
// 2. 5个默认值0的int元素
vector<int> v2(5);
// 3. 4个值为99的元素
vector<int> v3(4, 99);
// 4. 花括号直接初始化
vector<int> v4 = {10,20,30,40};
// 5. 拷贝已有容器
vector<int> v5(v4);
return 0;
}
三、核心常用成员函数
1. 尾部增删(效率最高)
push_back(数据):尾部追加元素pop_back():删除最后一个元素
cpp
运行
vector<int> v;
v.push_back(1);
v.push_back(2);
v.pop_back(); // 删掉2
2. 容量与大小区分
size():当前存储有效元素个数capacity():容器已分配内存容量(自动扩容)empty():判断容器是否为空resize(n):修改有效元素数量
3. 元素访问
[]下标访问,越界无报错at(下标):越界抛出out_of_range异常,安全front():获取首元素back():获取末尾元素
4. 插入、删除任意位置
insert(迭代器, 值):指定位置插入erase(迭代器):删除指定位置元素clear():清空所有有效元素,容量不变
四、迭代器遍历 vector(STL 标准遍历方式)
迭代器相当于容器指针,通用所有 STL 容器:
cpp
运行
vector<int> v = {1,3,5,7};
// 正向遍历
for(vector<int>::iterator it = v.begin(); it != v.end(); it++)
{
cout << *it << " ";
}
// 范围for简化遍历(C++11及以上)
for(int num : v)
{
cout << num << " ";
}
五、动态扩容机制
vector 内存连续存储,容量不足时自动开辟更大内存,拷贝旧数据后释放原内存:
初始容量 0,第一次 push 分配 1
后续每次扩容为原有容量 2 倍
扩容后原有迭代器全部失效,不可复用
六、vector 存储自定义结构体 / 类
cpp
运行
#include <iostream>
#include <vector>
#include <string>
using namespace std;
struct Student
{
string name;
int score;
};
int main()
{
vector<Student> stuList;
stuList.push_back({"小明",90});
stuList.push_back({"小红",85});
for(auto &s : stuList)
{
cout << s.name << " " << s.score << endl;
}
return 0;
}
七、新手易错点
erase删除元素后,当前迭代器失效,循环删除需更新迭代器混淆
size()有效元素和capacity()内存容量头部频繁 insert/pop_front 效率极低,vector 不适合头部大量操作
下标越界使用
[]不会报错,优先使用at()捕获异常
八、综合实战:动态学生分数录入、最高分查询
cpp
运行
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
vector<int> scoreList;
int input;
cout << "持续输入分数,输入-1结束录入:" << endl;
while(cin >> input && input != -1)
{
if(input >= 0 && input <= 100)
scoreList.push_back(input);
else
cout << "分数非法,跳过" << endl;
}
if(scoreList.empty())
{
cout << "无有效分数数据" << endl;
return 0;
}
// 获取最大值
int maxScore = *max_element(scoreList.begin(), scoreList.end());
cout << "最高分:" << maxScore << endl;
// 遍历打印全部分数
cout << "所有录入分数:";
for(int s : scoreList)
cout << s << " ";
return 0;
}
九、下期预告
下一篇:C++ STL map/unordered_map 键值对映射容器完整教程