C++ 的 std::vector 是标准库提供的动态数组容器,可在运行时改变长度,元素连续存储并自动管理内存。头文件 <vector>。本节说明创建、增删、容量与访问,并与内置数组对比;统一遍历见范围 for。

创建与 push_back

push_back 在 vector 的末尾追加一个元素,size() 随之加 1。下面先得到空容器,再先后放入 10 和 20:

#include <iostream>
#include <vector>

int main() {
    std::vector<int> v;
    v.push_back(10);   // 末尾追加 10,此时 v 为 {10}
    v.push_back(20);   // 再追加 20,此时 v 为 {10, 20}
    std::cout << v[0] << " size=" << v.size() << std::endl;
    return 0;
}

两次追加后长度为 2,v[0] 为 10。也可列表初始化:std::vector<int> w{1, 2, 3};。emplace_back 在容器内原地构造元素,对 int 与 push_back 差别不大。

修改长度

成员作用
size()当前元素个数
empty()是否无元素
clear()删除所有元素,size 为 0
push_back在末尾追加一个元素
pop_back()删除尾元素;调用前须非空
resize(n)改变元素个数,新增元素值初始化
std::vector<int> v = {1, 2, 3};
v.pop_back();
v.push_back(4);   // 变为 1, 2, 4

resize(5) 在末尾补默认值(int 为 0);resize(1) 只保留第一个元素。

容量与 reserve

capacity() 是已分配存储能容纳的元素个数,不必等于 size()。容量不足时 push_back 会换一块更大的存储并把旧元素搬过去,指向旧存储的指针和迭代器随之失效。reserve(n) 只扩大容量,不改变 size()。预先知道大约要放多少个时先 reserve,可减少搬迁次数:

C++ vector reserve运行
#include <iostream>
#include <vector>

int main() {
    std::vector<int> v;
    std::cout << v.size() << " " << v.capacity() << "\n";
    v.reserve(8);
    std::cout << v.size() << " " << v.capacity() << "\n";
    for (int i = 0; i < 5; ++i) {
        v.push_back(i);
    }
    std::cout << v.size() << " " << v.capacity() << "\n";
    return 0;
}

输出:

0 0
0 8
5 8

三行依次是预约前、预约后、追加 5 个元素后的 size 与 capacity。reserve(8) 之后长度仍是 0,只是预先留出了至少 8 个位置,后面 5 次 push_back 不必再扩容。

访问与遍历

std::vector<int> v = {3, 1, 4};

for (std::size_t i = 0; i < v.size(); ++i) {
    std::cout << v[i] << " ";
}
for (int x : v) {
    std::cout << x << " ";
}

下标循环须写 i < v.size(),不要写成 i <= v.size()。at(i) 带边界检查,越界抛异常;[] 不检查。front()、back() 访问首尾,勿对空容器调用 front / back / pop_back。

C++ vector 基本用法运行
#include <iostream>
#include <vector>

int main() {
    std::vector<int> v = {2, 4, 6};
    int sum = 0;
    for (int x : v) {
        sum += x;
    }
    std::cout << sum << std::endl;
    return 0;
}

输出:

12

与数组、array 的选择

  • 内置数组:固定小规模、栈分配、长度编译期已知;注意退化与越界。
  • std::array:固定长度、标准容器接口,大小是模板参数。
  • std::vector:长度随输入或逻辑变化、需频繁尾部增删时优先选用。

本节说明了 vector 的基本接口与容量语义。成员函数的逐条查阅见标准库 <vector>。下一节介绍范围 for:统一遍历容器与数组的写法。