📘vector容器

2026-08-11
⭐⭐ GESP 6级

📖概念讲解

vector 是 C++ STL 中最常用的动态数组容器,属于"序列容器"。它能自动扩容,不用你操心数组大小——这是它碾压普通数组的地方。

核心机制:vector 在内存中是一段连续空间,支持按下标 O(1) 随机访问。当 push_back 超出当前容量(capacity)时,它会申请一块大约 2 倍的新空间,把旧元素搬过去,再释放旧空间。

⚡ 考点重点:GESP 6 级常考 vector 的增删改查 + 迭代器 + 与数组的对比。记住:size() 是元素个数,capacity() 是当前分配空间大小,二者不同!

💻代码示例

1#include <iostream>
2#include <vector>
3using namespace std;
4
5int main() {
6 // 创建并初始化:5个元素,值都是10
7 vector<int> v(5, 10); // size=5, 每个元素是10
8
9 v.push_back(20); // 尾部追加20
10 v.push_back(30); // 尾部追加30
11 cout << "size=" << v.size() << endl; // 输出当前元素个数
12
13 // 下标遍历(和数组一样)
14 for(int i = 0; i < v.size(); i++) // 用 size() 而不是硬编码数字
15 cout << v[i] << " "; // 下标从0开始
16 cout << endl;
17
18 // 迭代器遍历(更通用)
19 for(auto it = v.begin(); it != v.end(); it++) // begin/end 迭代器区间
20 cout << *it << " "; // 解引用拿到值
21 cout << endl;
22
23 // 插入和删除
24 v.insert(v.begin() + 1, 99); // 在第2个位置插入99
25 v.erase(v.begin() + 3); // 删掉第4个元素
26
27 // 按值查找
28 auto pos = find(v.begin(), v.end(), 20); // 返回迭代器
29 if(pos != v.end())
30 cout << "找到了,位置是" << pos - v.begin() << endl; // 迭代器相减得到下标
31
32 return 0;
33}
34// 输出: size=7
35// 10 10 10 10 10 20 30
36// 10 10 10 10 10 20 30
37// 找到了,位置是5

🧩互动小测

Q1: vector<int> v(5); 执行后 v.size() 的值是?

Q2: 在 vector 中间插入一个元素,时间复杂度是?

Q3: 以下哪个不是 vector 的成员函数?

🏋️动手练一练

📝 编程练习

输入 n 个整数存入 vector,然后:
1. 输出所有偶数(偶数下标的元素)
2. 删除所有值为 0 的元素
3. 在末尾追加 100,输出最终 vector 的大小和所有元素

提示:用 erase 删除元素时,循环变量 i 不要自增,否则会跳过元素。
参考答案:
#include <iostream>
#include <vector>
using namespace std;

int main() {
    int n;
    cin >> n;
    vector<int> v(n);
    for(int i = 0; i < n; i++)
        cin >> v[i];              // 读入 n 个数

    // 输出偶数下标元素
    for(int i = 0; i < v.size(); i += 2)
        cout << v[i] << " ";      // i 从0开始步长2
    cout << endl;

    // 删除所有值为0的元素
    for(int i = 0; i < v.size(); ) {
        if(v[i] == 0)
            v.erase(v.begin() + i); // 删掉后 i 不动
        else
            i++;                     // 没删才自增
    }

    v.push_back(100);               // 末尾加100
    cout << v.size() << endl;      // 输出大小
    for(int i = 0; i < v.size(); i++)
        cout << v[i] << " ";
    cout << endl;
    return 0;
}

要点:erase 后原位置的元素前移,所以 i 不要 +1,否则跳过下一个。size() 会实时变化,循环条件自动适配。

📝易错点提醒

学完这个知识点后点一下