📋 核心要点
  • 不关心元素顺序时,用 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
}