std::vector 是 C++ 标准模板库(STL)中最常用、最重要的序列容器之一。它是一个动态数组(Dynamic Array),能够自动管理内存,在需要时自动增长或缩小其存储空间。
动态大小:大小可以在运行时动态改变。当插入元素导致容量不足时,vector 会自动分配一块更大的内存,将旧数据复制或移动到新内存,并释放旧内存(称为“扩容”或“reallocate”)。
连续存储 (Contiguous Storage):元素在内存中是连续存放的,就像一个普通的数组。这意味着你可以像访问数组一样使用指针或下标访问元素,并且可以将 vector 的数据传递给期望普通数组的 C 风格函数。
高效的随机访问:由于元素连续存储,通过下标 [] 或 at() 访问任意元素的时间复杂度为 O(1)。
尾部高效操作:在尾部插入(push_back)和删除(pop_back)元素非常高效,平均时间复杂度为 O(1)(扩容时为 O(n),但摊还后为 O(1))。
低效的中间/头部插入删除:在中间或开头插入/删除元素需要移动后续所有元素,时间复杂度为 O(n),效率较低。
值语义:std::vector 存储的是元素的副本(或移动后的值)。当你将对象放入 vector,它会被复制或移动。
内存管理与性能
扩容策略:当 size() == capacity() 且需要插入新元素时,vector 会重新分配内存。通常,新的容量是旧容量的 1.5 倍或 2 倍(具体实现相关)。
reserve() 的重要性:如果你预先知道要存储的元素数量,调用 reserve(n) 可以避免多次扩容,显著提升性能。
迭代器失效:
- 插入: 时如果发生扩容,所有迭代器、指针、引用都会失效。如果未扩容,只有插入点及之后的迭代器失效。
- 删除:被删除元素及之后的迭代器、指针、引用失效。
- push_back:如果发生扩容,全部失效;否则仅 end() 失效。