##### cppreference.com

##### Search

Create account

##### Namespaces

- Page
- Discussion

##### Variants

##### Views

- View
- Edit
- History

##### Actions

# std::swap

From cppreference.com
< cpp‎ | algorithm

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

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)

### [edit] 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`.

### [edit] Return value

(none)

### [edit] 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))) | (until C++17)
`noexcept` specification: noexcept(std::is_nothrow_swappable_v<T2>) | (since C++17)

### [edit] Complexity

1) Constant
2) Linear in N

### [edit] Specializations

std::swap may be specialized in namespace std for user-defined types, but such specializations are not found by ADL (the namespace std is not the associated namespace for the user-defined type). The expected way to make a user-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) [edit]
std::swap(std::tuple) (C++11) | specializes the std::swap algorithm (function template) [edit]
std::swap(std::shared_ptr) (C++11) | specializes the std::swap algorithm (function template) [edit]
std::swap(std::weak_ptr) (C++11) | specializes the std::swap algorithm (function template) [edit]
std::swap(std::unique_ptr) (C++11) | specializes the std::swap algorithm (function template) [edit]
std::swap(std::function) (C++11) | specializes the std::swap algorithm (function template) [edit]
std::swap(std::basic_string) | specializes the std::swap algorithm (function template) [edit]
std::swap(std::array) (C++11) | specializes the std::swap algorithm (function template) [edit]
std::swap(std::deque) | specializes the std::swap algorithm (function template) [edit]
std::swap(std::forward_list) (C++11) | specializes the std::swap algorithm (function template) [edit]
std::swap(std::list) | specializes the std::swap algorithm (function template) [edit]
std::swap(std::vector) | specializes the std::swap algorithm (function template) [edit]
std::swap(std::map) | specializes the std::swap algorithm (function template) [edit]
std::swap(std::multimap) | specializes the std::swap algorithm (function template) [edit]
std::swap(std::set) | specializes the std::swap algorithm (function template) [edit]
std::swap(std::multiset) | specializes the std::swap algorithm (function template) [edit]
std::swap(std::unordered_map) (C++11) | specializes the std::swap algorithm (function template) [edit]
std::swap(std::unordered_multimap) (C++11) | specializes the std::swap algorithm (function template) [edit]
std::swap(std::unordered_set) (C++11) | specializes the std::swap algorithm (function template) [edit]
std::swap(std::unordered_multiset) (C++11) | specializes the std::swap algorithm (function template) [edit]
std::swap(std::queue) | specializes the std::swap algorithm (function template) [edit]
std::swap(std::priority_queue) | specializes the std::swap algorithm (function template) [edit]
std::swap(std::stack) | specializes the std::swap algorithm (function template) [edit]
std::swap(std::valarray) (C++11) | specializes the std::swap() algorithm (function template) [edit]
std::swap(std::basic_stringbuf) (C++11) | specializes the std::swap algorithm (function template) [edit]
std::swap(std::basic_istringstream) (C++11) | specializes the std::swap algorithm (function template) [edit]
std::swap(std::basic_ostringstream) (C++11) | specializes the std::swap algorithm (function template) [edit]
std::swap(std::basic_stringstream) (C++11) | specializes the std::swap algorithm (function template) [edit]
std::swap(std::basic_filebuf) (C++11) | specializes the std::swap algorithm (function template) [edit]
std::swap(std::basic_ifstream) (C++11) | specializes the std::swap algorithm (function template) [edit]
std::swap(std::basic_ofstream) (C++11) | specializes the std::swap algorithm (function template) [edit]
std::swap(std::basic_fstream) (C++11) | specializes the std::swap algorithm (function template) [edit]
std::swap(std::basic_regex) (C++11) | specializes the std::swap algorithm (function template) [edit]
std::swap(std::match_results) (C++11) | specializes the `std::swap()` algorithm (function template) [edit]
std::swap(std::thread) (C++11) | specializes the std::swap algorithm (function template) [edit]
std::swap(std::unique_lock) (C++11) | specialization of std::swap for `unique_lock` (function template) [edit]
std::swap(std::promise) (C++11) | specializes the std::swap algorithm (function template) [edit]
std::swap(std::packaged_task) (C++11) | specializes the std::swap algorithm (function template) [edit]
std::swap(std::optional) (C++17) | specializes the std::swap algorithm (function) [edit]
std::swap(std::any) (C++17) | specializes the std::swap algorithm (function) [edit]
std::swap(std::variant) (C++17) | specializes the std::swap algorithm (function) [edit]
swap(std::filesystem::path) | swaps two paths (function) [edit]

### [edit] 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

### [edit] See also

iter_swap | swaps the elements pointed to by two iterators (function template) [edit]
swap_ranges | swaps two ranges of elements (function template) [edit]

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

- conditionally noexcept

Hidden categories:

- Pages with unreviewed conditional noexcept template
- Pages with unreviewed noexcept template