std::swap

From cppreference.com
< cpp‎ | algorithm
 
 
Algorithm library
Constrained algorithms and algorithms on ranges (C++20)
Constrained algorithms, e.g. ranges::copy, ranges::sort, ...
Execution policies (C++17)
Non-modifying sequence operations
Batch operations
(C++17)
Search operations
(C++11)                (C++11)(C++11)

Modifying sequence operations
Copy operations
(C++11)
(C++11)
Swap operations
swap
Transformation operations
Generation operations
Removing operations
Order-changing operations
(until C++17)(C++11)
(C++20)(C++20)
Sampling operations
(C++17)

Sorting and related operations
Partitioning operations
Sorting operations
Binary search operations
(on partitioned ranges)
Set operations (on sorted ranges)
Merge operations (on sorted ranges)
Heap operations
Minimum/maximum operations
(C++11)
(C++17)
Lexicographical comparison operations
Permutation operations
C library
Numeric operations
Operations on uninitialized memory
 
Defined in header <algorithm>
(until C++11)
Defined in header <utility>
(since C++11)
Defined in header <string_view>
template< class T >
void swap( T& a, T& b );
(1) (conditionally noexcept since C++11)
(constexpr since C++20)
template< class T2, std::size_t N >
void swap( T2 (&a)[N], T2 (&b)[N] );
(2) (conditionally noexcept since C++11)
(constexpr since C++20)

Exchanges the given values.

1) Swaps the values a and b.

This overload participates in overload resolution only if std::is_move_constructible_v<T> && std::is_move_assignable_v<T> is true.

(since C++17)
2) Swaps the arrays a and b. Equivalent to std::swap_ranges(a, a + N, b).

This overload participates in overload resolution only if 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 CopyConstructible and CopyAssignable(until C++11)MoveConstructible and MoveAssignable(since C++11).
-
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.
(since C++11)
(until C++17)
noexcept specification:  
(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:

specializes the std::swap algorithm
(function template)
specializes the std::swap algorithm
(function template)
specializes the std::swap algorithm
(function template)
specializes the std::swap algorithm
(function template)
specializes the std::swap algorithm
(function template)
specializes the std::swap algorithm
(function template)
specializes the std::swap algorithm
(function template)
specializes the std::swap algorithm
(function template)
specializes the std::swap algorithm
(function template)
specializes the std::swap algorithm
(function template)
specializes the std::swap algorithm
(function template)
specializes the std::swap algorithm
(function template)
specializes the std::swap algorithm
(function template)
specializes the std::swap algorithm
(function template)
specializes the std::swap algorithm
(function template)
specializes the std::swap algorithm
(function template)
specializes the std::swap algorithm
(function template)
specializes the std::swap algorithm
(function template)
specializes the std::swap algorithm
(function template)
specializes the std::swap algorithm
(function template)
specializes the std::swap algorithm
(function template)
specializes the std::swap algorithm
(function template)
specializes the std::swap algorithm
(function template)
specializes the std::swap algorithm
(function template)
specializes the std::swap algorithm
(function template)
specializes the std::swap algorithm
(function template)
specializes the std::swap algorithm
(function template)
specializes the std::swap algorithm
(function template)
specializes the std::swap algorithm
(function template)
specializes the std::swap algorithm
(function template)
specializes the std::swap algorithm
(function template)
specializes the std::swap algorithm
(function template)
specializes the std::swap algorithm
(function template)
specializes the std::swap algorithm
(function template)
specializes the std::swap algorithm
(function template)
specializes the std::swap algorithm
(function template)
specializes the std::swap algorithm
(function template)
specializes the std::swap algorithm
(function template)
specializes the std::swap algorithm
(function template)
specializes the std::swap algorithm
(function)
specializes the std::swap algorithm
(function template)
specializes the std::swap algorithm
(function template)
specializes the std::swap algorithm
(function template)
specializes the std::swap algorithm
(function template)
specializes the std::swap algorithm
(function template)
specializes the std::swap algorithm
(function)
specializes the std::swap algorithm
(function template)
specializes the std::swap algorithm
(function template)
specializes the std::swap algorithm
(function)
specializes the std::swap algorithm
(function)
specializes the std::swap algorithm
(function)
specializes the std::swap algorithm
(function)
specializes the std::swap algorithm
(function)
specializes the std::swap algorithm
(function)

Example

#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';
}

Output:

5 3
3 5
A::id=6 A::id=9
swap(A::id=6, A::id=9)
A::id=9 A::id=6

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 227 C++98 T was not required to be CopyConstructible or DefaultConstructible
(a temporary object of type T might not be able to be constructed)
T is also required to
be CopyConstructible
LWG 809 C++98 arrays could not be swapped added overload (2)
LWG 2554 C++11 swapping multi-dimensional arrays can never
be noexcept due to name lookup problems
made to work

See also

swaps the values of two objects
(customization point object)
swaps the elements pointed to by two iterators
(function template)
swaps two ranges of elements
(function template)
(C++14)
replaces the argument with a new value and returns its previous value
(function template)