用户_29571846
发布于 2026-06-22 / 1 阅读
0
0

C++ STL 容器:vector 动态可变数组完整实战教程

一、前言

普通数组长度固定,运行时无法扩容,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. 元素访问

  1. []下标访问,越界无报错

  2. at(下标):越界抛出out_of_range异常,安全

  3. front():获取首元素

  4. 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 内存连续存储,容量不足时自动开辟更大内存,拷贝旧数据后释放原内存:

  1. 初始容量 0,第一次 push 分配 1

  2. 后续每次扩容为原有容量 2 倍

  3. 扩容后原有迭代器全部失效,不可复用

六、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;
}

七、新手易错点

  1. erase删除元素后,当前迭代器失效,循环删除需更新迭代器

  2. 混淆size()有效元素和capacity()内存容量

  3. 头部频繁 insert/pop_front 效率极低,vector 不适合头部大量操作

  4. 下标越界使用[]不会报错,优先使用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 键值对映射容器完整教程


评论