std::swap
Материал из cppreference.com
<tbody>
</tbody>
<tbody class="t-dcl-rev t-dcl-rev-num ">
</tbody><tbody>
</tbody>
<tbody class="t-dcl-rev t-dcl-rev-num ">
</tbody><tbody>
</tbody>
| Определено в заголовочном файле <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( /* смотрите ниже */ ); |
(начиная с C++11) (до C++20) |
|
template< class T > constexpr void swap( T& a, T& b ) noexcept( /* смотрите ниже */ ); |
(начиная с 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( /* смотрите ниже */ ); |
(начиная с C++11) (до C++20) |
|
template< class T2, std::size_t N > constexpr void swap( T2 (&a)[N], T2 (&b)[N] ) noexcept( /* смотрите ниже */ ); |
(начиная с 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 должен соответствовать требованиям CopyConstructible и CopyAssignable (до C++11)MoveConstructible и MoveAssignable (начиная с C++11)
| ||
-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++11) (до C++17) |
|
спецификация noexcept:
noexcept(std::is_nothrow_swappable_v<T2>) |
(начиная с C++17) |
Сложность
1) Константная
2) Линейная по
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 (шаблон функции) | |
| специализация алгоритма std::swap (шаблон функции) | |
| специализация алгоритма std::swap (шаблон функции) | |
| специализация алгоритма std::swap (шаблон функции) | |
| специализация алгоритма std::swap (шаблон функции) | |
(C++11) |
специализация алгоритма std::swap (шаблон функции) |
| специализация алгоритма std::swap (шаблон функции) | |
(C++11) |
специализация алгоритма std::swap (шаблон функции) |
(C++11) |
специализация алгоритма std::swap (шаблон функции) |
Специализируется std::swap алгоритм Оригинал: specializes the std::swap algorithm Текст был переведён автоматически используя Переводчик Google. Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда. (шаблон функции) | |
| специализирует алгоритм std::swap (шаблон функции) | |
| специализирует алгоритм std::swap (шаблон функции) | |
| специализирует алгоритм std::swap (шаблон функции) | |
Специализируется std::swap алгоритм Оригинал: specializes the std::swap algorithm Текст был переведён автоматически используя Переводчик Google. Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда. (шаблон функции) | |
| специализирует алгоритм std::swap (шаблон функции) | |
| специализирует алгоритм std::swap (шаблон функции) | |
| специализирует алгоритм std::swap (шаблон функции) | |
| специализирует алгоритм std::swap (шаблон функции) | |
| специализирует алгоритм std::swap (шаблон функции) | |
| специализирует алгоритм std::swap (шаблон функции) | |
| специализирует алгоритм std::swap (шаблон функции) | |
| специализирует алгоритм std::swap (шаблон функции) | |
(C++11) |
специализация алгоритма std::swap (шаблон функции) |
Специализируется std::swap() алгоритмОригинал: specializes the std::swap() algorithmТекст был переведён автоматически используя Переводчик Google. Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда. (шаблон функции) | |
(C++11) |
специализация алгоритма std::swap (функция) |
Специализация std::swap для unique_lockОригинал: specialization of std::swap for unique_lockТекст был переведён автоматически используя Переводчик Google. Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда. (шаблон функции) | |
(C++14) |
специализация std::swap для shared_lock (шаблон функции) |
(C++11) |
специализация алгоритма std::swap (шаблон функции) |
Специализируется std::swap алгоритм Оригинал: specializes the std::swap algorithm Текст был переведён автоматически используя Переводчик Google. Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда. (шаблон функции) | |
(C++17) |
специализация алгоритма std::swap (шаблон функции) |
(C++17) |
специализация алгоритма std::swap (функция) |
(C++17) |
специализация алгоритма std::swap (шаблон функции) |
| специализация алгоритма std::swap (шаблон функции) | |
(C++17) |
меняет местами два пути (функция) |
(C++23) |
специализация алгоритма std::swap (функция) |
(C++20) |
специализация алгоритма std::swap (функция) |
| перегружает алгоритм 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); // ошибка, не соблюдены требования к типу
swap(p, q); // OK, ADL находит подходящую дружественную `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++:
| Номер | Применён | Поведение в стандарте | Корректное поведение |
|---|---|---|---|
| LWG 227 | C++98 | T не обязательно должен быть CopyConstructible илиDefaultConstructible (временный объект типа T может быть не создан)
|
T также должен быть CopyConstructible
|
| LWG 809 | C++98 | нельзя поменять местами массивы | добавлена перегрузка (2) |
| LWG 2554 | C++11 | обмен многомерных массивов никогда не может быть noexcept из-запроблем с поиском имени |
сделано работоспособным |
Смотрите также
(C++20) |
обменивает значения двух объектов (объект точки настройки) |
| меняет местами элементы, на которые указывают два итератора (шаблон функции) | |
| меняет местами два диапазона элементов (шаблон функции) | |
(C++14) |
заменяет аргумент новым значением и возвращает его предыдущее значение (шаблон функции) |