std::swap
来自cppreference.com
                    
                                        
                    
                    
                                                            
                    | (C++11 前) (C++11 起) | ||
| template< class T > void swap( T& a, T& b ); | (1) | |
| template< class T2, std::size_t N > void swap( T2 (&a)[N], T2 (&b)[N]); | (2) | (C++11 起) | 
交换给定值
1) 交换 
a 与 b 。此重载仅若 std::is_move_constructible_v<T> && std::is_move_assignable_v<T> 为 true 才参与重载决议。 (C++17 起)2) 交换 
a 与 b 数组。等效于调用 std::swap_ranges(a, a+N, b) 。此重载仅若 std::is_swappable_v<T2> 为 true 才参与重载决议。 (C++17 起)| 目录 | 
[编辑] 参数
| a, b | - | 要交换的值 | 
| 类型要求 | ||
| - T必须满足 MoveAssignable和 MoveConstructible 的要求。 | ||
| - T2必须满足 Swappable 的要求。 | ||
[编辑] 返回值
(无)
[编辑] 异常
1) 
| (无) | (C++11 前) | 
| noexcept 规定:  
 noexcept(     std::is_nothrow_move_constructible<T>::value && | (C++11 起) | 
2) 
| noexcept 规定:  
异常规定中标识符 noexcept(noexcept(swap(*a, *b))) swap的查找在通常查找规则的所找到的任何内容外,还会找到此函数模板,这使得异常规定等价于 C++17 std::is_nothrow_swappable 。 | (C++17 前) | 
| noexcept 规定:  
 noexcept(std::is_nothrow_swappable_v<T2>) | (C++17 起) | 
[编辑] 复杂度
1) 常量
2) 与 N 呈线性
[编辑] 特化
std::swap 可以对用户定义类型在命名空间 std 中特化,但这些特化不会为 ADL所寻找(命名空间 std 并非对用户定义类型的关联空间)。令用户定义类型可交换的期待方式是在与该类型相同的命名空间中提供非成员函数 swap :细节见可交换 (Swappable) 。
标准库已提供下列重载:
| (C++11) | 特化 std::swap 算法 (函数模板) | 
| (C++11) | 特化 std::swap 算法 (函数模板) | 
| (C++11) | 特化 std::swap 算法 (函数模板) | 
| (C++11) | 特化 std::swap 算法 (函数模板) | 
| (C++11) | 特化 std::swap 算法 (函数模板) | 
| (C++11) | 特化 std::swap 算法 (函数模板) | 
| 特化 std::swap 算法 (函数模板) | |
| (C++11) | 特化 std::swap 算法 (函数模板) | 
| 特化 std::swap 算法 (函数模板) | |
| (C++11) | 特化 std::swap 算法 (函数模板) | 
| 特化 std::swap 算法 (函数模板) | |
| 特化 std::swap 算法 (函数模板) | |
| 特化 std::swap 算法 (函数模板) | |
| 特化 std::swap 算法 (函数模板) | |
| 特化 std::swap 算法 (函数模板) | |
| 特化 std::swap 算法 (函数模板) | |
| 特化 std::swap 算法 (函数模板) | |
| 特化 std::swap 算法 (函数模板) | |
| 特化 std::swap 算法 (函数模板) | |
| 特化 std::swap 算法 (函数模板) | |
| 特化 std::swap 算法 (函数模板) | |
| 特化 std::swap 算法 (函数模板) | |
| 特化 std::swap 算法 (函数模板) | |
| (C++11) | 特化 std::swap() 算法 (函数模板) | 
| 特化 std::swap 算法 (函数模板) | |
| 特化 std::swap 算法 (函数模板) | |
| 特化 std::swap 算法 (函数模板) | |
| 特化 std::swap 算法 (函数模板) | |
| 特化 std::swap 算法 (函数模板) | |
| 特化 std::swap 算法 (函数模板) | |
| 特化 std::swap 算法 (函数模板) | |
| 特化 std::swap 算法 (函数模板) | |
| (C++11) | 特化 std::swap 算法 (函数模板) | 
| 特化 std::swap() 算法 (函数模板) | |
| (C++11) | 特化 std::swap 算法 (函数模板) | 
| (C++11) | std::swap 对 unique_lock的特化(函数模板) | 
| (C++11) | 特化 std::swap 算法 (函数模板) | 
| 特化 std::swap 算法 (函数模板) | |
| (C++17) | 特化 std::swap 算法 (函数) | 
| (C++17) | 特化 std::swap 算法 (函数) | 
| (C++17) | 特化 std::swap 算法 (函数) | 
| 交换二个路径 (函数) | 
[编辑] 示例
运行此代码
输出:
5 3 3 5
[编辑] 缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
| DR | 应用于 | 出版时的行为 | 正确行为 | 
|---|---|---|---|
| LWG 2554 | C++11 | 因为名称查找问题,交换多维数组无法为 noexcept | 令它可行 | 
[编辑] 参阅
| 交换两个迭代器所指向的元素 (函数模板) | |
| 交换两个范围的元素 (函数模板) | 


