swap() 是最安全高效的方式,直接调用 vector::swap() 或 std::swap() 均为 O(1)、noexcept、零拷贝,交换内部指针、size、capacity 和 allocator,不触发元素复制或重分配。

用 swap() 是最安全高效的方式
直接调用 vector::swap() 成员函数,或使用 std::swap(),两者等价且零拷贝。这是标准做法,不触发元素复制、移动或内存重分配。
-
vec1.swap(vec2)和std::swap(vec1, vec2)效果完全相同,底层都交换内部指针、size 和 capacity - 即使
vec1和vec2容量差异极大(比如一个空,一个有百万元素),交换也恒定时间 O(1) - 不会抛异常(
noexcept),比手动清空+赋值可靠得多
别用 assign() 或 = 赋值来“交换”
写成 temp = vec1; vec1 = vec2; vec2 = temp; 看似直观,实际会触发三次深拷贝(或移动),尤其当 vector 存储非 trivial 类型时开销明显。
- 如果 vector 元素是
std::string或自定义类,=会调用拷贝/移动构造,而swap()只交换三四个指针 -
vec1.assign(vec2.begin(), vec2.end())同样是复制行为,还可能引发内存重新分配 - 在 move-aware 编译器下,
std::move赋值仍不如swap()干净——它改变源对象状态,而swap()对称、可预测
注意:swap() 交换的是整个容器状态,不是仅交换元素
它连带交换 size()、capacity()、allocator(如果 allocator 不是 always_equal)和所有内部指针。这点常被忽略,但影响实际行为。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 交换后,原
vec1.capacity()变成新vec1.capacity(),即原vec2.capacity()—— 不是取 max 或保持不变 - 若两个 vector 使用不同 allocator(如自定义分配器且未声明
is_always_equal = true),swap()可能抛异常或未定义行为 - 对
std::vector<bool></bool>同样适用,但要注意它是特化模板,swap()仍保证 O(1)
跨作用域或临时 vector 的交换要小心
把 vector 和一个临时对象 swap,常用于快速清空并释放内存,但这不是“交换两个已有 vector”的场景,容易混淆目的。
立即学习“C++免费学习笔记(深入)”;
-
std::vector<int>().swap(vec);</int>是清空 + 释放内存的标准惯用法,但此时只有一个 vector 参与 - 若误写成
std::swap(vec1, std::vector<int>(1000));</int>,右边是临时对象,交换后立即析构,vec1会拿到那个临时 vector 的资源——合法但语义奇怪,通常没必要 - 真正需要交换两个已命名 vector 时,就老老实实写
vec1.swap(vec2),别绕弯

















