C++ 开发与语法
vector 扩容后,哪些引用会失效
区分容量增长、插入和删除造成的迭代器失效。
原理
vector 重新分配时会移动或复制元素到新存储区。原有指针、引用和迭代器指向旧存储,不能继续解引用。
开发中的做法
提前知道元素数时可以 reserve 减少扩容。即使不扩容,中间插入仍会影响插入点及其后的迭代器,erase 同样会影响删除点及其后的迭代器。
验证与追问
遍历并删除时使用 erase 的返回值。若要跨操作保留定位信息,先判断索引在插入和删除后是否还对应同一个逻辑元素。
代码片段
for (auto it = items.begin(); it != items.end();) {
if (should_remove(*it)) it = items.erase(it);
else ++it;
}