std::swap
来自cppreference.com
(C++11 前) (C++11 起) | ||
(1) | ||
template<class T > void swap( T& a, T& b ); | (C++11 前) | |
template<class T > void swap( T& a, T& b )noexcept(/* see below */); | (C++11 起) (C++20 前) | |
template<class T > constexprvoid swap( T& a, T& b )noexcept(/* see below */); | (C++20 起) | |
(2) | ||
template<class T2, std::size_t N > void swap( T2 (&a)[N], T2 (&b)[N])noexcept(/* see below */); | (C++11 起) (C++20 前) | |
template<class T2, std::size_t N > constexprvoid swap( T2 (&a)[N], T2 (&b)[N])noexcept(/* see below */); | (C++20 起) | |
交换给定值
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 算法 (函数模板) | |
特化 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 | 使之可能 |
[编辑]参阅
交换两个迭代器所指向的元素 (函数模板) | |
交换两个范围的元素 (函数模板) |