std::swap
Определено в заголовке <algorithm> | (до C++11) | |
|---|---|---|
Определено в заголовке <utility> | (с C++11) | |
Определено в заголовке <string_view> | (с C++17) | |
| (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 > constexpr void 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] ); | (до C++11) | |
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 > constexpr void swap( T2 (&a)[N], T2 (&b)[N] ) noexcept( /* see below */ ); | (с C++20) |
Меняет заданные значения.
a и b. Эта перегрузка не участвует в разрешении перегрузки, если std::is_move_constructible_v<T> && std::is_move_assignable_v<T> не true.(с C++17)
a и b. По сути, вызывает std::swap_ranges(a, a + N, b). Эта перегрузка не участвует в разрешении перегрузки, если std::is_swappable_v<T2> не true.(с C++17)
Параметры
| a, b | - | значения, которые нужно поменять местами |
| Требования к типу | ||
-T должно удовлетворять требованиям CopyConstructible и CopyAssignable(до C++11)MoveConstructible и MoveAssignable(с C++11) |
||
-T2 должно удовлетворять требованиям Swappable. |
||
Возвращаемое значение
(нет)
Исключения
| (нет) | (до C++11) |
noexcept спецификация: noexcept( | (с C++11) |
noexcept спецификация: noexcept(noexcept(swap(*a, *b)))swap в спецификации исключений находит эту шаблонную функцию помимо всего, что найдено обычными правилами поиска, делая спецификацию исключений эквивалентной C++17 std::is_nothrow_swappable. |
(с C++11) (до C++17) |
noexcept спецификация: noexcept(std::is_nothrow_swappable_v<T2>) | (с C++17) |
Сложность
N
Специализации
|
| (до C++20) |
Ожидаемый способ сделать тип, определённый программой, переключаемым, — это предоставить внечленённую функцию 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 (шаблон функции) |
|
|
(C++11) | специализирует алгоритм std::swap (шаблон функции) |
|
(C++11) | специализирует алгоритм std::swap (шаблон функции) |
|
(C++11) | специализирует алгоритм std::swap (шаблон функции) |
|
(C++11) | специализирует алгоритм std::swap (шаблон функции) |
|
(C++11) | специализирует алгоритм std::swap (шаблон функции) |
|
(C++11) | специализирует алгоритм std::swap (шаблон функции) |
|
(C++11) | специализирует алгоритм std::swap (шаблон функции) |
|
(C++11) | специализирует алгоритм std::swap (шаблон функции) |
|
(C++11) | специализирует алгоритм std::swap (шаблон функции) |
|
(C++11) | специализирует алгоритм std::swap (шаблон функции) |
|
(C++11) | специализирует алгоритм std::swap (шаблон функции) |
|
(C++11) | специализирует алгоритм std::swap (шаблон функции) |
|
(C++11) | специализирует алгоритм std::swap (шаблон функции) |
|
(C++11) | специализирует алгоритм std::swap (шаблон функции) |
|
(C++11) | специализирует алгоритм std::swap (шаблон функции) |
|
(C++11) | специализирует алгоритм std::swap (шаблон функции) |
|
(C++20) | специализирует алгоритм std::swap (шаблон функции) |
|
(C++23) | специализирует алгоритм std::swap (шаблон функции) |
|
(C++23) | специализирует алгоритм std::swap (шаблон функции) |
|
(C++23) | специализирует алгоритм std::swap (шаблон функции) |
|
(C++23) | специализирует алгоритм std::swap (шаблон функции) |
|
(C++11) | специализирует алгоритм std::swap (шаблон функции) |
|
(C++11) | специализирует алгоритм std::swap (шаблон функции) |
|
(C++11) | специализирует алгоритм std::swap (функция) |
|
(C++11) | специализация std::swap для unique_lock (шаблон функции) |
|
(C++14) | специализация std::swap для shared_lock (шаблон функции) |
|
(C++11) | специализирует алгоритм std::swap (шаблон функции) |
|
(C++11) | специализирует алгоритм std::swap (шаблон функции) |
|
(C++17) | специализирует алгоритм std::swap (шаблон функции) |
|
(C++17) | специализирует алгоритм std::swap (функция) |
|
(C++17) | специализирует алгоритм std::swap (шаблон функции) |
|
(C++23) | специализирует алгоритм std::swap (шаблон функции) |
|
(C++17) | меняет местами два пути (функция) |
|
(C++23) | специализирует алгоритм std::swap (функция) |
|
(C++20) | специализирует алгоритм std::swap (функция) |
|
(C++23) | перегружает алгоритм std::swap (функция) |
|
(C++20) | специализирует алгоритм std::swap (функция) |
|
(C++20) | специализирует алгоритм std::swap (функция) |
Пример
#include <algorithm>
#include <iostream>
namespace Ns
{
class A
{
int id {};
friend void swap(A& lhs, A& rhs)
{
std::cout << "swap(" << lhs << ", " << rhs << ")\n";
std::swap(lhs.id, rhs.id);
}
friend std::ostream& operator<<(std::ostream& os, A const& a)
{
return os << "A::id=" << a.id;
}
public:
A(int i) : id {i} {}
A(A const&) = delete;
A& operator = (A const&) = delete;
};
}
int main()
{
int a = 5, b = 3;
std::cout << a << ' ' << b << '\n';
std::swap(a, b);
std::cout << a << ' ' << b << '\n';
Ns::A p {6}, q {9};
std::cout << p << ' ' << q << '\n';
// std::swap(p, q); // error, type requirements are not satisfied
swap(p, q); // OK, ADL finds the appropriate friend `swap`
std::cout << p << ' ' << q << '\n';
}Вывод:
5 3 3 5 A::id=6 A::id=9 swap(A::id=6, A::id=9) A::id=9 A::id=6
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были применены ретроспективно к ранее опубликованным стандартам C++.
| DR | Применено к | Поведение при публикации | Корректное поведение |
|---|---|---|---|
| LWG 227 | C++98 |
T не должно было быть CopyConstructible или DefaultConstructible(объект-временная переменная типа T мог не быть создан) |
T также должнобыть CopyConstructible |
| LWG 809 | C++98 | массивы нельзя было поменять местами | добавлен перегруз (2) |
| LWG 2554 | C++11 | перестановка многомерных массивов никогда не могла быть noexcept из-за проблем со поиском имён | стало работать |
См. также
|
(C++20) | меняет местами значения двух объектов (объект-точка кастомизации) |
| меняет местами элементы, на которые указывают два итератора (шаблон функции) |
|
| меняет местами два диапазона элементов (шаблон функции) |
|
|
(C++14) | заменяет аргумент новым значением и возвращает его предыдущее значение (шаблон функции) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/algorithm/swap