The Wayback Machine - https://web.archive.org/web/20180611055310/http://zh.cppreference.com:80/w/cpp/algorithm/swap

std::swap

来自cppreference.com
< cpp‎ | algorithm
 
 
算法库
执行策略 (C++17)
不修改序列的操作
(C++11)
(C++11)
(C++11)
(C++17)
修改序列的操作
未初始化存储上的操作
划分操作
排序操作
二分搜索操作
集合操作(在已排序范围上)
堆操作
(C++11)
最小/最大操作
(C++11)
(C++17)
排列
数值运算
C 库
 
定义于头文件 <algorithm>
定义于头文件 <utility>
(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) 交换 ab此重载仅若 std::is_move_constructible_v<T>&&std::is_move_assignable_v<T>true 才参与重载决议。(C++17 起)
2) 交换 ab 数组。等效于调用 std::swap_ranges(a, a+N, b)此重载仅若 std::is_swappable_v<T2>true 才参与重载决议。(C++17 起)

目录

[编辑]参数

a, b - 要交换的值
类型要求
-
T 必须满足 MoveAssignableMoveConstructible 的要求。
-
T2 必须满足 Swappable 的要求。

[编辑]返回值

(无)

[编辑]异常

1)

(无)

(C++11 前)
noexcept 规定:  
noexcept(

    std::is_nothrow_move_constructible<T>::value&&
    std::is_nothrow_move_assignable<T>::value

)
(C++11 起)
2)
noexcept 规定:  
noexcept(noexcept(swap(*a, *b)))
异常规定中标识符 swap 的查找在通常查找规则的所找到的任何内容外,还会找到此函数模板,这使得异常规定等价于 C++17 std::is_nothrow_swappable
(C++17 前)
noexcept 规定:  
(C++17 起)

[编辑]复杂度

1) 常量
2) 与 N 成线性

[编辑]特化

std::swap 可以对用户定义类型在命名空间 std 中特化,但这些特化不会为 ADL所寻找(命名空间 std 并非对用户定义类型的关联空间)。令用户定义类型可交换的期待方式是在与该类型相同的命名空间中提供非成员函数 swap :细节见可交换 (Swappable) 。

标准库已提供下列重载:

特化 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 算法
(函数模板)[编辑]
特化 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 算法
(函数模板)[编辑]
特化 std::swap 算法
(函数模板)[编辑]
特化 std::swap 算法
(函数模板)[编辑]
特化 std::swap 算法
(函数模板)[编辑]
特化 std::swap 算法
(函数模板)[编辑]
特化 std::swap 算法
(函数模板)[编辑]
特化 std::swap 算法
(函数模板)[编辑]
特化 std::swap() 算法
(函数模板)[编辑]
特化 std::swap 算法
(函数模板)[编辑]
std::swapunique_lock 的特化
(函数模板)[编辑]
特化 std::swap 算法
(函数模板)[编辑]
特化 std::swap 算法
(函数模板)[编辑]
特化 std::swap 算法
(函数)[编辑]
特化 std::swap 算法
(函数)[编辑]
特化 std::swap 算法
(函数)[编辑]
交换二个路径
(函数)[编辑]

[编辑]示例

#include <algorithm>#include <iostream>   int main(){int a =5, b =3;   // 前std::cout<< a <<' '<< b <<'\n';   std::swap(a,b);   // 后std::cout<< a <<' '<< b <<'\n';}

输出:

5 3 3 5

[编辑] 缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

DR 应用于 出版时的行为 正确行为
LWG 2554 C++11 因为名称查找问题,交换多维数组无法为 noexcept 使之可能

[编辑]参阅

交换两个迭代器所指向的元素
(函数模板)[编辑]
交换两个范围的元素
(函数模板)[编辑]
close