std::swap_ranges 是 c++20 新增函数,要求编译器支持 c++20(clang 10+/gcc 10+/msvc 19.28+)且两区间长度严格相等,否则越界或忽略;它逐对调用 std::swap,依赖类型 swap 实现,不检查迭代器有效性。

std::swap_ranges 在 C++20 才正式加入标准库
它不是 C++11/14/17 的可用函数,如果你在旧标准下编译失败(比如报错 ‘swap_ranges’ is not a member of ‘std’),不是你写错了,而是编译器不支持。确认你的编译器启用 C++20:Clang 10+、GCC 10+、MSVC 19.28+,且编译选项含 -std=c++20 或等效设置。
调用 std::swap_ranges 必须保证两个区间长度相等
该函数不会检查长度,只按迭代器逐对交换——若第二个区间更短,会越界读写;若更长,后半段被忽略。实际使用前必须手动校验:
auto len1 = std::distance(first1, last1);
auto len2 = std::distance(first2, last2);
if (len1 != len2) {
// 不可调用 swap_ranges!
}
- 不能依赖容器的
size()—— 比如传入原始数组指针时,std::swap_ranges(arr1, arr1 + N, arr2, arr2 + M)中N和M必须严格相等 - 用
std::vector时也别想当然:v1.begin(), v1.end()和v2.begin(), v2.begin() + v1.size()才安全,直接用v2.end()可能越界
std::swap_ranges 交换的是元素值,不是迭代器或指针本身
它等价于对每个位置 i 执行 std::swap(*it1, *it2)。这意味着:
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 对
int、double等 POD 类型,就是位交换,无额外开销 - 对自定义类型,依赖其
swap函数或 ADL 查找的swap—— 如果没提供特化或友元swap,会退回到拷贝赋值,可能很慢甚至失败(比如含const成员) - 对
std::unique_ptr这类移动语义类型,交换极快;但对未禁用拷贝的资源持有者(如某些手写 RAII 类),要确认swap是否 noexcept
替代方案:C++17 及以前只能手写循环或用 std::swap + std::transform
如果无法升级到 C++20,最稳妥做法是显式循环:
for (auto it1 = first1, it2 = first2; it1 != last1 && it2 != last2; ++it1, ++it2) {
std::swap(*it1, *it2);
}
或者用 std::transform 配合 lambda(但不如循环直观):
std::transform(first1, last1, first2, first2,
[](auto& a, auto& b) { std::swap(a, b); return b; });
- 注意:lambda 返回值会被赋给目标位置,所以返回
b是为了“透传”原值(实际效果同 swap) - 这种写法易出错,且语义不清,不推荐日常使用;纯循环更直白、易调试、编译器优化友好
真正容易被忽略的是:哪怕用了 C++20,也要检查区间有效性 —— swap_ranges 不做空指针或无效迭代器防护,传入 nullptr 或已失效迭代器,行为未定义。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










