📋 核心要点
- 不关心元素顺序时,用
swap+pop_back删除元素,复杂度 O(1) - 相比
erase(需移动后续所有元素,O(n))快得多,适合元素量大、顺序无关的场景 - 代价是破坏元素原有顺序:被删位置会被末尾元素顶替
- 典型三步:
std::find定位 →std::swap(*it, vec.back())→vec.pop_back()
不关心元素顺序时高效删除元素
如果在删除元素时不关心 std::vector 中元素的顺序,可以使用 swap + pop_back 删除元素。相比 erase 删除元素(需要搬移其后的所有元素),交换 + 弹出要快很多。
❯C++
#include <vector>
#include <algorithm>
#include <iostream>
int main() {
std::vector<int> vec{1, 2, 3, 4, 5, 6, 7};
std::for_each(vec.begin(), vec.end(), [](const auto& it) { std::cout << it << " "; }); // 1 2 3 4 5 6 7
auto it = std::find(vec.begin(), vec.end(), 5);
if (it != vec.end()) {
std::swap(*it, vec.back()); // 把待删元素与末尾元素交换
vec.pop_back(); // 弹出末尾(原待删元素)
}
std::cout << std::endl;
std::for_each(vec.begin(), vec.end(), [](auto& it) { std::cout << it << " "; }); // 1 2 3 4 7 6
}