std::swap
Определён в заголовочном файле <algorithm> | (до C++11) | |
|---|---|---|
Определён в заголовочном файле <utility> | (начиная с C++11) | |
Определён в заголовочном файле <string_view> | ||
template< class T > void swap( T& a, T& b ); | (1) | (условно noexcept начиная с C++11) (constexpr начиная с C++20) |
template< class T2, std::size_t N > void swap( T2 (&a)[N], T2 (&b)[N] ); | (2) | (условно noexcept начиная с C++11) (constexpr начиная с C++20) |
Обменивает заданные значения.
a и b. | Эта перегрузка участвует в разрешении перегрузки только если | (начиная с C++17) |
a и b. Эквивалентно std::swap_ranges(a, a + N, b). | Эта перегрузка участвует в разрешении перегрузки только если | (начиная с C++17) |
Параметры
| a, b | - | значения, которые нужно поменять местами |
| Требования к типам | ||
-T должен удовлетворять требованиям CopyConstructible и CopyAssignable(до C++11)MoveConstructible и MoveAssignable(начиная с C++11). |
||
-T2 должен удовлетворять требованиям Swappable. |
||
Возвращаемое значение
(нет)
Исключения
| (нет) | (до C++11) |
Спецификация noexcept: noexcept(
std::is_nothrow_move_constructible<T>::value &&
std::is_nothrow_move_assignable<T>::value
)
| (начиная с C++11) |
Спецификация noexcept: noexcept(noexcept(swap(*a, *b))) swap в спецификации исключений этот шаблон функции находится наряду со всеми сущностями, найденными обычными правилами поиска, поэтому спецификация исключений эквивалентна std::is_nothrow_swappable из C++17. |
(начиная с 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 (шаблон функции) |
|
(C++14) | специализирует алгоритм std::swap (шаблон функции) |
|
(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) | специализирует алгоритм std::swap (функция) |
|
(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++20) | |
|
(C++14) | заменяет аргумент новым значением и возвращает его предыдущее значение (шаблон функции) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/algorithm/swap