PHIL / NOTES
← 返回笔记目录
C++ 开发与语法

vector 扩容后,哪些引用会失效

区分容量增长、插入和删除造成的迭代器失效。

原理

vector 重新分配时会移动或复制元素到新存储区。原有指针、引用和迭代器指向旧存储,不能继续解引用。

开发中的做法

提前知道元素数时可以 reserve 减少扩容。即使不扩容,中间插入仍会影响插入点及其后的迭代器,erase 同样会影响删除点及其后的迭代器。

验证与追问

遍历并删除时使用 erase 的返回值。若要跨操作保留定位信息,先判断索引在插入和删除后是否还对应同一个逻辑元素。

代码片段

for (auto it = items.begin(); it != items.end();) {
    if (should_remove(*it)) it = items.erase(it);
    else ++it;
}