Пространства имён
Варианты
Действия

std::swap

Материал из cppreference.com
< cpp‎ | algorithm
 
 
Библиотека алгоритмов
Ограниченные алгоритмы и алгоритмы над диапазонами (C++20)
Ограниченные алгоритмы, например ranges::copy, ranges::sort, ...
Политики исполнения (C++17)
Немодифицирующие операции над последовательностями
(C++11)(C++11)(C++11)
(C++17)
Модифицирующие операции над последовательностями
Операции разбиения
Операции сортировки
(C++11)
Операции двоичного поиска
Операции с наборами (в отсортированных диапазонах)
Операции с кучей
(C++11)
Операций минимума/максимума
(C++11)
(C++17)

Операции перестановки
Числовые операции
Операции с неинициализированной памятью
(C++17)
(C++17)
(C++17)
Библиотека C
 
Определено в заголовочном файле <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:  
(начиная с C++17)

[править] Сложность

1) Константная
2) Линейная по N

[править] Специализации

std::swap может быть специализирована в пространстве имён std для программно-определяемых типов, но такие специализации не находятся ADL (пространство имён std не является ассоциированным пространством имён для программно-определяемого типа).

(до C++20)

Ожидаемый способ сделать программно-определяемый тип заменяемым, предоставить функцию 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 алгоритм
Оригинал:
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
(шаблон функции) [править]
специализация алгоритма std::swap
(шаблон функции) [править]
Специализируется std::swap() алгоритм
Оригинал:
specializes the std::swap() algorithm
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

(шаблон функции) [править]
специализация алгоритма std::swap
(функция) [править]
Специализация std::swap для unique_lock
Оригинал:
specialization of std::swap for unique_lock
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

(шаблон функции) [править]
специализация std::swap для shared_lock
(шаблон функции) [править]
специализация алгоритма 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
(функция) [править]
специализирует алгоритм 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++14)
заменяет аргумент новым значением и возвращает его предыдущее значение
(шаблон функции) [править]