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, 4resize(5) 在末尾补默认值(int 为 0);resize(1) 只保留第一个元素。
容量与 reserve
capacity() 是已分配存储能容纳的元素个数,不必等于 size()。容量不足时 push_back 会换一块更大的存储并把旧元素搬过去,指向旧存储的指针和迭代器随之失效。reserve(n) 只扩大容量,不改变 size()。预先知道大约要放多少个时先 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。
#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:统一遍历容器与数组的写法。