# std::swap

From cppreference.com
< cpp‎ | algorithm

Defined in header `<algorithm>` |  | (until C++11)
Defined in header `<utility>` |  | (since C++11)
| (1) |
template< class T > void swap( T& a, T& b ); |  | (until C++11)
template< class T > void swap( T& a, T& b ) noexcept(/* see below */); |  | (since C++11) (until C++20)
template< class T > constexpr void swap( T& a, T& b ) noexcept(/* see below */); |  | (since C++20)
| (2) |
template< class T2, std::size_t N > void swap( T2 (&a)[N], T2 (&b)[N]) noexcept(/* see below */); |  | (since C++11) (until C++20)
template< class T2, std::size_t N > constexpr void swap( T2 (&a)[N], T2 (&b)[N]) noexcept(/* see below */); |  | (since C++20)

Exchanges the given values.

1) Swaps the values `a` and `b`. This overload does not participate in overload resolution unless std::is_move_constructible_v<T> && std::is_move_assignable_v<T> is true. (since C++17)
2) Swaps the arrays `a` and `b`. In effect calls std::swap_ranges(a, a+N, b). This overload does not participate in overload resolution unless std::is_swappable_v<T2> is true. (since C++17)

### Parameters

a, b | - | the values to be swapped
Type requirements
- `T` must meet the requirements of MoveAssignable and MoveConstructible.
- `T2` must meet the requirements of Swappable.

### Return value

(none)

### Exceptions

1)

(none) | (until C++11)
`noexcept` specification: noexcept( std::is_nothrow_move_constructible<T>::value && std::is_nothrow_move_assignable<T>::value ) | (since C++11)

2)

`noexcept` specification: noexcept(noexcept(swap(*a, *b))) The lookup for the identifier `swap` in the exception specification finds this function template in addition to anything found by the usual lookup rules, making the exception specification equivalent to C++17 std::is_nothrow_swappable. | (until C++17)
`noexcept` specification: noexcept(std::is_nothrow_swappable_v<T2>) | (since C++17)

### Complexity

1) Constant
2) Linear in N

### Specializations

`std::swap` may be specialized in namespace std for program-defined types, but such specializations are not found by ADL (the namespace std is not the associated namespace for the program-defined type). | (until C++20)

The expected way to make a program-defined type swappable is to provide a non-member function swap in the same namespace as the type: see Swappable for details.

The following overloads are already provided by the standard library:

std::swap(std::pair) (C++11) | specializes the std::swap algorithm (function template)
std::swap(std::tuple) (C++11) | specializes the std::swap algorithm (function template)
std::swap(std::shared_ptr) (C++11) | specializes the std::swap algorithm (function template)
std::swap(std::weak_ptr) (C++11) | specializes the std::swap algorithm (function template)
std::swap(std::unique_ptr) (C++11) | specializes the std::swap algorithm (function template)
std::swap(std::function) (C++11) | specializes the std::swap algorithm (function template)
std::swap(std::basic_string) | specializes the std::swap algorithm (function template)
std::swap(std::array) (C++11) | specializes the std::swap algorithm (function template)
std::swap(std::deque) | specializes the std::swap algorithm (function template)
std::swap(std::forward_list) (C++11) | specializes the std::swap algorithm (function template)
std::swap(std::list) | specializes the std::swap algorithm (function template)
std::swap(std::vector) | specializes the std::swap algorithm (function template)
std::swap(std::map) | specializes the std::swap algorithm (function template)
std::swap(std::multimap) | specializes the std::swap algorithm (function template)
std::swap(std::set) | specializes the std::swap algorithm (function template)
std::swap(std::multiset) | specializes the std::swap algorithm (function template)
std::swap(std::unordered_map) (C++11) | specializes the std::swap algorithm (function template)
std::swap(std::unordered_multimap) (C++11) | specializes the std::swap algorithm (function template)
std::swap(std::unordered_set) (C++11) | specializes the std::swap algorithm (function template)
std::swap(std::unordered_multiset) (C++11) | specializes the std::swap algorithm (function template)
std::swap(std::queue) | specializes the std::swap algorithm (function template)
std::swap(std::priority_queue) | specializes the std::swap algorithm (function template)
std::swap(std::stack) | specializes the std::swap algorithm (function template)
std::swap(std::valarray) (C++11) | specializes the std::swap() algorithm (function template)
std::swap(std::basic_stringbuf) (C++11) | specializes the std::swap algorithm (function template)
std::swap(std::basic_istringstream) (C++11) | specializes the std::swap algorithm (function template)
std::swap(std::basic_ostringstream) (C++11) | specializes the std::swap algorithm (function template)
std::swap(std::basic_stringstream) (C++11) | specializes the std::swap algorithm (function template)
std::swap(std::basic_filebuf) (C++11) | specializes the std::swap algorithm (function template)
std::swap(std::basic_ifstream) (C++11) | specializes the std::swap algorithm (function template)
std::swap(std::basic_ofstream) (C++11) | specializes the std::swap algorithm (function template)
std::swap(std::basic_fstream) (C++11) | specializes the std::swap algorithm (function template)
std::swap(std::basic_syncbuf) (C++20) | specializes the std::swap algorithm (function template)
std::swap(std::basic_regex) (C++11) | specializes the std::swap algorithm (function template)
std::swap(std::match_results) (C++11) | specializes the `std::swap()` algorithm (function template)
std::swap(std::thread) (C++11) | specializes the std::swap algorithm (function template)
std::swap(std::unique_lock) (C++11) | specialization of std::swap for `unique_lock` (function template)
std::swap(std::promise) (C++11) | specializes the std::swap algorithm (function template)
std::swap(std::packaged_task) (C++11) | specializes the std::swap algorithm (function template)
std::swap(std::optional) (C++17) | specializes the std::swap algorithm (function)
std::swap(std::any) (C++17) | specializes the std::swap algorithm (function)
std::swap(std::variant) (C++17) | specializes the std::swap algorithm (function)
swap(std::filesystem::path) | swaps two paths (function)

### Example

Run this code

    #include <algorithm>
    #include <iostream>

    int main()
    {
       int a = 5, b = 3;

       // before
       std::cout << a << ' ' << b << '\n';

       std::swap(a,b);

       // after
       std::cout << a << ' ' << b << '\n';
    }

Output:

    5 3
    3 5

### Defect reports

The following behavior-changing defect reports were applied retroactively to previously published C++ standards.

DR | Applied to | Behavior as published | Correct behavior
--- | --- | --- | ---
LWG 2554 | C++11 | swapping multi-dimensional arrays can never be `noexcept` due to name lookup problems | made to work

### See also

iter_swap | swaps the elements pointed to by two iterators (function template)
swap_ranges | swaps two ranges of elements (function template)
exchange (C++14) | replaces the argument with a new value and returns its previous value (function template)

Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/algorithm/swap&oldid=109606"