std::vector是自动管理内存的动态数组,支持随机访问且可变大小;定义需#include ,初始化方式包括空容器、指定大小、初始化列表等;访问元素推荐at()确保安全,增删首选尾部操作,容量管理用reserve和shrink_to_fit优化性能。

std::vector 是 C++ STL 中最常用、最实用的容器之一,本质就是一个**自动管理内存的动态数组**。它既保留了原生数组随机访问快的优点,又解决了数组大小固定、手动管理内存的痛点。
怎么定义和初始化 vector
必须包含头文件 #include
-
空容器:
std::vectorv; -
指定大小(默认值):
std::vector→ 创建 5 个 0.0v(5); -
指定大小 + 初始值:
std::vector→ {'x','x','x'}v(3, 'x'); -
初始化列表(C++11 起):
std::vectorv = {1, 2, 3, 4}; -
从数组拷贝:
int a[] = {10, 20, 30}; std::vectorv(a, a+3); -
复制构造:
std::vector或v2(v1); v2.assign(v1.begin(), v1.end());
怎么安全又高效地访问元素
访问方式有多种,用途和风险不同:
-
v[i]:最快,但不检查越界(i 超出0 ~ size()-1就是未定义行为) -
v.at(i):带边界检查,越界抛std::out_of_range异常,适合调试或关键逻辑 -
v.front()/v.back():分别取首尾元素,要求非空,否则行为未定义 -
v.data():返回指向首元素的原始指针(C++11),可用于传给 C 风格 API
怎么增删改查元素
操作位置直接影响效率,尤其注意“中间操作”代价高:
立即学习“C++免费学习笔记(深入)”;
-
尾部添加:
v.push_back(x)—— 均摊 O(1),推荐高频使用 -
尾部删除:
v.pop_back()—— O(1),不释放内存,只减小 size -
任意位置插入:
v.insert(v.begin()+i, x)—— O(n),后续所有元素右移 -
任意位置删除:
v.erase(v.begin()+i)或区间v.erase(it1, it2)—— O(n),后续左移 -
清空全部:
v.clear()—— size 变 0,capacity 通常不变(内存没释放)
怎么管好容量和内存
size 和 capacity 容易混淆,但对性能影响很大:
-
v.size():当前有多少个有效元素 -
v.capacity():已分配但未必全用上的空间大小(单位:元素个数) -
v.empty():等价于v.size() == 0 -
v.reserve(n):预分配至少 n 个元素的空间,避免多次扩容(推荐在知道大致规模时调用) -
v.resize(n):把 size 改成 n;若变大,新增元素默认构造或填指定值;若变小,多余元素被析构 -
v.shrink_to_fit():请求系统把 capacity 缩到接近 size(非强制,C++11 起)
扩容机制因编译器而异:GCC 通常翻倍,MSVC 常用 1.5 倍。每次扩容都涉及新内存分配 + 元素拷贝/移动 + 旧内存释放,所以合理预分配很关键。
基本上就这些。vector 不复杂,但容易忽略 capacity 和 insert/erase 的开销。用好它,核心就三点:优先尾部操作、预估大小用 reserve、越界访问用 at()。










