定义于头文件
算法库提供大量用途的函数(例如查找、排序、计数、操作),它们在元素范围上操作。注意范围定义为 [first, last)
,其中 last
指代要查询或修改的最后元素的后一个元素。
std::swap
template< class T > | (1) | (C++11 前) |
template< class T > | (C++11 起) (C++20 前) | |
template< class T > | (C++20 起) | |
template< class T2, std::size_t N > | (2) | (C++11 起) (C++20 前) |
template< class T2, std::size_t N > | (C++20 起) |
交换给定值
1) 交换 a
与 b
。此重载仅若 std::is_move_constructible_v
2) 交换 a
与 b
数组。等效于调用 std::swap_ranges(a, a+N, b) 。此重载仅若 std::is_swappable_v
a, b | - | 要交换的值 |
类型要求 | ||
- T 必须满足可移动赋值 (MoveAssignable) 和 可移动构造 (MoveConstructible) 的要求。 | ||
- T2 必须满足可交换 (Swappable) 的要求。 |
(无)
(无) | (C++11 前) |
noexcept 规定: noexcept( std::is_nothrow_move_constructible | (C++11 起) |
noexcept 规定: noexcept(noexcept(swap(*a, *b))) 异常规定中标识符swap 的查找在通常查找规则的所找到的任何内容外,还会找到此函数模板,这使得异常规定等价于 C++17 std::is_nothrow_swappable 。 | (C++17 前) |
noexcept 规定: noexcept(std::is_nothrow_swappable_v | (C++17 起) |
1) 常量
2) 与 N 成线性
| (C++20 前) |
令程序定义类型可交换的期待方式是在与该类型相同的命名空间中提供非成员函数 swap :细节见可交换 (Swappable) 。
标准库已提供下列重载:
std::swap(std::pair) (C++11) | 特化 std::swap 算法 (函数模板) |
std::swap(std::tuple) (C++11) | 特化 std::swap 算法 (函数模板) |
std::swap(std::shared_ptr) (C++11) | 特化 std::swap 算法 (函数模板) |
std::swap(std::weak_ptr) (C++11) | 特化 std::swap 算法 (函数模板) |
std::swap(std::unique_ptr) (C++11) | 特化 std::swap 算法 (函数模板) |
std::swap(std::function) (C++11) | 特化 std::swap 算法 (函数模板) |
std::swap(std::basic_string) | 特化 std::swap 算法 (函数模板) |
std::swap(std::array) (C++11) | 特化 std::swap 算法 (函数模板) |
std::swap(std::deque) | 特化 std::swap 算法 (函数模板) |
std::swap(std::forward_list) (C++11) | 特化 std::swap 算法 (函数模板) |
std::swap(std::list) | 特化 std::swap 算法 (函数模板) |
std::swap(std::vector) | 特化 std::swap 算法 (函数模板) |
std::swap(std::map) | 特化 std::swap 算法 (函数模板) |
std::swap(std::multimap) | 特化 std::swap 算法 (函数模板) |
std::swap(std::set) | 特化 std::swap 算法 (函数模板) |
std::swap(std::multiset) | 特化 std::swap 算法 (函数模板) |
std::swap(std::unordered_map) (C++11) | 特化 std::swap 算法 (函数模板) |
std::swap(std::unordered_multimap) (C++11) | 特化 std::swap 算法 (函数模板) |
std::swap(std::unordered_set) (C++11) | 特化 std::swap 算法 (函数模板) |
std::swap(std::unordered_multiset) (C++11) | 特化 std::swap 算法 (函数模板) |
std::swap(std::queue) | 特化 std::swap 算法 (函数模板) |
std::swap(std::priority_queue) | 特化 std::swap 算法 (函数模板) |
std::swap(std::stack) | 特化 std::swap 算法 (函数模板) |
std::swap(std::valarray) (C++11) | 特化 std::swap() 算法 (函数模板) |
std::swap(std::basic_stringbuf) (C++11) | 特化 std::swap 算法 (函数模板) |
std::swap(std::basic_istringstream) (C++11) | 特化 std::swap 算法 (函数模板) |
std::swap(std::basic_ostringstream) (C++11) | 特化 std::swap 算法 (函数模板) |
std::swap(std::basic_stringstream) (C++11) | 特化 std::swap 算法 (函数模板) |
std::swap(std::basic_filebuf) (C++11) | 特化 std::swap 算法 (函数模板) |
std::swap(std::basic_ifstream) (C++11) | 特化 std::swap 算法 (函数模板) |
std::swap(std::basic_ofstream) (C++11) | 特化 std::swap 算法 (函数模板) |
std::swap(std::basic_fstream) (C++11) | 特化 std::swap 算法 (函数模板) |
std::swap(std::basic_syncbuf) (C++20) | 特化 std::swap 算法 (函数模板) |
std::swap(std::basic_regex) (C++11) | 特化 std::swap 算法 (函数模板) |
std::swap(std::match_results) (C++11) | 特化 std::swap() 算法 (函数模板) |
std::swap(std::thread) (C++11) | 特化 std::swap 算法 (函数模板) |
std::swap(std::unique_lock) (C++11) | std::swap 对 unique_lock 的特化(函数模板) |
std::swap(std::promise) (C++11) | 特化 std::swap 算法 (函数模板) |
std::swap(std::packaged_task) (C++11) | 特化 std::swap 算法 (函数模板) |
std::swap(std::optional) (C++17) | 特化 std::swap 算法 (函数) |
std::swap(std::any) (C++17) | 特化 std::swap 算法 (函数) |
std::swap(std::variant) (C++17) | 特化 std::swap 算法 (函数) |
swap(std::filesystem::path) | 交换二个路径 (函数) |
- #include <algorithm>
- #include <functional>
- #include <iostream>
- #include <iterator>
- #include <vector>
-
- struct Cell
- {
- int x;
- int y;
- Cell &operator+=(Cell &cell)
- {
- x += cell.x;
- y += cell.y;
- return *this;
- }
- };
-
- std::ostream &operator<<(std::ostream &os, const Cell &cell)
- {
- os << "{" << cell.x << "," << cell.y << "}";
- return os;
- }
-
- int main()
- {
- auto func1 = []()
- {
- static Cell cell = {99, 100};
- cell.x += 2;
- cell.y += 2;
- return cell;
- };
-
- std::vector<Cell> cells_1(6);
- std::generate_n(cells_1.begin(), cells_1.size(), func1);
- std::vector<Cell> cells_2(8);
- std::generate_n(cells_2.begin(), cells_2.size(), func1);
-
- std::cout << "original : " << std::endl;
- std::cout << "cells_1 : ";
- std::copy(cells_1.begin(), cells_1.end(), std::ostream_iterator<Cell>(std::cout, " "));
- std::cout << std::endl;
- std::cout << "cells_2 : ";
- std::copy(cells_2.begin(), cells_2.end(), std::ostream_iterator<Cell>(std::cout, " "));
- std::cout << std::endl << std::endl;
-
- std::swap(cells_1, cells_2);
- std::cout << "new : " << std::endl;
- std::cout << "cells_1 : ";
- std::copy(cells_1.begin(), cells_1.end(), std::ostream_iterator<Cell>(std::cout, " "));
- std::cout << std::endl;
- std::cout << "cells_2 : ";
- std::copy(cells_2.begin(), cells_2.end(), std::ostream_iterator<Cell>(std::cout, " "));
- std::cout << std::endl << std::endl;
- }