正确删除vector元素须用erase配合迭代器,如v.erase(v.begin()+i);批量删除应采用remove_if+erase组合,避免下标操作导致越界或漏删,且需注意erase后迭代器失效及手动shrink_to_fit释放内存。
用 erase 删除单个或连续元素,别直接用下标删
直接写 v[i] = v.back(); v.pop_back(); 这类操作会破坏顺序、漏删、甚至越界——vector 不是哈希表,删除中间元素必须靠 erase 移动后续数据。正确做法是传入迭代器:v.erase(v.begin() + i) 删第 i 个,或 v.erase(it) 删指定位置的迭代器。
注意:erase 返回被删元素后一个位置的迭代器(C++11 起),所以循环中边删边遍历时不能简单 i++,否则跳过下一个元素。
- 删所有偶数:用
remove_if+erase组合(见下节) - 删第 0 个:用
v.erase(v.begin()),不是v.erase(0)(编译不过) - 删最后一个:优先用
v.pop_back(),比v.erase(--v.end())快且语义清晰
remove_if + erase 是删多个元素的标准套路
remove_if 不真删,只是把要保留的元素往前挪,返回新逻辑尾部的迭代器;再用 erase 一次性抹掉后面那段“脏数据”。这是唯一高效、安全、符合 STL 习惯的批量删除方式。
例如删掉所有值为 0 的元素: