Namespaces
Variants
Views
Actions

std::swap

From cppreference.com
< cpp‎ | algorithm
Revision as of 17:41, 10 December 2012 by Nate (Talk | contribs)

 
 
 

Template:ddcl list begin <tr class="t-dsc-header">

<td>
Defined in header <algorithm>
Defined in header <utility>
</td>

<td></td>

<td>
(until C++11)
(since C++11)
</td>

<tr class="t-dcl ">

<td >
template< class T >
void swap( T& a, T& b );
</td>

<td > (1) </td> <td class="t-dcl-nopad"> </td> </tr> <tr class="t-dcl ">

<td >
template< class T2, size_t N >
void swap( T2 (&a)[N], T2 (&b)[N]);
</td>

<td > (2) </td> <td > (since C++11) </td> </tr> Template:ddcl list end

Exchanges the given values.

1) Swaps the values a and b.

2) Swaps the arrays a and b. In effect calls std::swap_ranges(a, a+N, b).

Contents

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)
noexcept specification:  
noexcept(noexcept(

    std::is_nothrow_move_constructible<T>::value &&
    std::is_nothrow_move_assignable<T>::value

))
2)
noexcept specification:  
noexcept(noexcept(swap(*a, *b)))

Complexity

1) Constant

2) Linear in N

Specializations

Both custom specializations and overloads of the std::swap algorithm are allowed, but the overloads are generally preferred since specializations of a function template aren't allowed for template classes. Library functions always use the user-provided overloads when swapping, if they are found by argument-dependent lookup (as per Swappable concept).

The following overloads are already provided by the standard library:

Template:cpp/memory/shared ptr/dcl list swap2Template:cpp/memory/weak ptr/dcl list swap2Template:cpp/memory/unique ptr/dcl list swap2Template:cpp/string/basic string/dcl list swap2Template:cpp/container/dcl list swap2Template:cpp/container/dcl list swap2Template:cpp/container/dcl list swap2Template:cpp/container/dcl list swap2Template:cpp/container/dcl list swap2Template:cpp/container/dcl list swap2Template:cpp/container/dcl list swap2Template:cpp/container/dcl list swap2Template:cpp/container/dcl list swap2Template:cpp/container/dcl list swap2Template:cpp/container/dcl list swap2Template:cpp/container/dcl list swap2Template:cpp/container/dcl list swap2Template:cpp/container/dcl list swap2Template:cpp/container/dcl list swap2Template:cpp/container/dcl list swap2Template:cpp/io/basic fstream/dcl list swap2Template:cpp/io/basic fstream/dcl list swap2Template:cpp/io/basic fstream/dcl list swap2
specializes the std::swap algorithm
(function template) [edit]
specializes the std::swap algorithm
(function template) [edit]
specializes the std::swap algorithm
(function template) [edit]
specializes the Template:cpp/ltf algorithm
(function template)
specializes the Template:cpp/ltf algorithm
(function template)
specializes the Template:cpp/ltf algorithm
(function template)
specializes the Template:cpp/ltf algorithm
(function template)
specializes the Template:cpp/ltf algorithm
(function template)
specializes the Template:cpp/ltf algorithm
(function template)
specializes the Template:cpp/ltf algorithm
(function template)
specializes the Template:cpp/ltf algorithm
(function template)
specializes the std::swap algorithm
(function template) [edit]
specializes the Template:cpp/ltf algorithm
(function template)
specializes the Template:cpp/ltf algorithm
(function template)
specializes the Template:cpp/ltf algorithm
(function template)

Example

#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

See also

Template:cpp/algorithm/dcl list iter swapTemplate:cpp/algorithm/dcl list swap ranges