std::swap(3)
π NAME π
std::swap β std::swap
Okay bestie, this is the std::swap(3) page from the C++ Standard Libary β yes, that's the header vibe β and the name is literally std::swap. We're swapping things. It's giving glow-up for values. β¨
β¨ Synopsis β¨
Lowkey the headers changed over time, so here's the whole map, no cap:
Defined in header <algorithm> (until C++11)
Defined in header <utility> (since C++11)
Defined in header <string_view>
template< class T > (until C++11)
void swap( T& a, T& b );
template< class T > (since C++11)
void swap( T& a, T& b ) noexcept(/* see below */)
(constexpr since C++20);
template< class T2, std::size_t N > (1)
(until C++11)
void swap( T2 (&a)[N], T2 (&b)[N] );
template< class T2, std::size_t N > (2)
(since C++11)
void swap( T2 (&a)[N], T2 (&b)[N] ) noexcept(/* see below */)
(constexpr since C++20);
So the whole point: exchanges the given values. Iconic, honestly. π«Ά
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. In effect calls 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
CopyConstructibleandCopyAssignable(until C++11), andMoveConstructibleandMoveAssignable(since C++11). - T2 must meet the requirements of
Swappable.
π Return value π
(none) β literally nothing comes back, bestie. The swap is the moment. π
π₯ Exceptions π₯
1)
(until C++11) (none)
(since C++11) noexcept specification:
noexcept(
std::is_nothrow_move_constructible<T>::value &&
std::is_nothrow_move_assignable<T>::value
)
2)
noexcept specification:
noexcept(noexcept(swap(*a, *b)))
(since C++11) (until C++17) 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++17) noexcept specification:
noexcept(std::is_nothrow_swappable_v<T2>)
π¦ 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 thestd::swapalgorithm (function template)std::swap(std::tuple)(C++11) β specializes thestd::swapalgorithm (function template)std::swap(std::shared_ptr)(C++11) β specializes thestd::swapalgorithm (function template)std::swap(std::weak_ptr)(C++11) β specializes thestd::swapalgorithm (function template)std::swap(std::unique_ptr)(C++11) β specializes thestd::swapalgorithm (function template)std::swap(std::function)(C++11) β specializes thestd::swapalgorithm (function template)std::swap(std::basic_string)β specializes thestd::swapalgorithm (function template)std::swap(std::array)(C++11) β specializes thestd::swapalgorithm (function template)std::swap(std::deque)β specializes thestd::swapalgorithm (function template)std::swap(std::forward_list)(C++11) β specializes thestd::swapalgorithm (function template)std::swap(std::list)β specializes thestd::swapalgorithm (function template)std::swap(std::vector)β specializes thestd::swapalgorithm (function template)std::swap(std::map)β specializes thestd::swapalgorithm (function template)std::swap(std::multimap)β specializes thestd::swapalgorithm (function template)std::swap(std::set)β specializes thestd::swapalgorithm (function template)std::swap(std::multiset)β specializes thestd::swapalgorithm (function template)std::swap(std::unordered_map)(C++11) β specializes thestd::swapalgorithm (function template)std::swap(std::unordered_multimap)(C++11) β specializes thestd::swapalgorithm (function template)std::swap(std::unordered_set)(C++11) β specializes thestd::swapalgorithm (function template)std::swap(std::unordered_multiset)(C++11) β specializes thestd::swapalgorithm (function template)std::swap(std::queue)(C++11) β specializes thestd::swapalgorithm (function template)std::swap(std::priority_queue)(C++11) β specializes thestd::swapalgorithm (function template)std::swap(std::stack)(C++11) β specializes thestd::swapalgorithm (function template)std::swap(std::valarray)(C++11) β specializes thestd::swapalgorithm (function template)std::swap(std::basic_stringbuf)(C++11) β specializes thestd::swapalgorithm (function template)std::swap(std::basic_istringstream)(C++11) β specializes thestd::swapalgorithm (function template)std::swap(std::basic_ostringstream)(C++11) β specializes thestd::swapalgorithm (function template)std::swap(std::basic_stringstream)(C++11) β specializes thestd::swapalgorithm (function template)std::swap(std::basic_filebuf)(C++11) β specializes thestd::swapalgorithm (function template)std::swap(std::basic_ifstream)(C++11) β specializes thestd::swapalgorithm (function template)std::swap(std::basic_ofstream)(C++11) β specializes thestd::swapalgorithm (function template)std::swap(std::basic_fstream)(C++11) β specializes thestd::swapalgorithm (function template)std::swap(std::basic_syncbuf)(C++20) β specializes thestd::swapalgorithm (function template)std::swap(std::basic_spanbuf)(C++23) β specializes thestd::swapalgorithm (function template)std::swap(std::basic_ispanstream)(C++23) β specializes thestd::swapalgorithm (function template)std::swap(std::basic_ospanstream)(C++23) β specializes thestd::swapalgorithm (function template)std::swap(std::basic_spanstream)(C++23) β specializes thestd::swapalgorithm (function template)std::swap(std::basic_regex)(C++11) β specializes thestd::swapalgorithm (function template)std::swap(std::match_results)(C++11) β specializes thestd::swapalgorithm (function template)std::swap(std::thread)(C++11) β specializes thestd::swapalgorithm (function)std::swap(std::unique_lock)(C++11) β specialization ofstd::swapforunique_lock(function template)std::swap(std::shared_lock)(C++14) β specialization ofstd::swapforshared_lock(function template)std::swap(std::promise)(C++11) β specializes thestd::swapalgorithm (function template)std::swap(std::packaged_task)(C++11) β specializes thestd::swapalgorithm (function template)std::swap(std::optional)(C++17) β specializes thestd::swapalgorithm (function template)std::swap(std::any)(C++17) β specializes thestd::swapalgorithm (function)std::swap(std::variant)(C++17) β specializes thestd::swapalgorithm (function template)std::swap(std::basic_stacktrace)(C++23) β specializes thestd::swapalgorithm (function template)swap(std::filesystem::path)(C++17) β swaps two paths (function)swap(std::expected)(C++23) β specializes thestd::swapalgorithm (function)swap(std::jthread)(C++20) β specializes thestd::swapalgorithm (function)swap(std::move_only_function)(C++23) β overloads thestd::swapalgorithm (function)swap(std::stop_source)(C++20) β specializes thestd::swapalgorithm (function)swap(std::stop_token)(C++20) β specializes thestd::swapalgorithm (function)
β¨ Example β¨
okay bestie, this is the little demo and itβs honestly iconic. Run this code and watch std::swap do its thing:
// Run this code
#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
A quick vibe check on what youβre seeing: the plain ints trade places first, no drama. Then Ns::A shows up with its id values, and the call std::swap(p, q); is commented out because β per the comment β itβs an error, since the type requirements are not satisfied. But swap(p, q); is OK because ADL finds the appropriate friend swap. The friend prints its little message, swaps the ids, and everybody claps. π
π Defect reports π
These behavior-changing defect reports got applied retroactively to previously published C++ standards β receipts below, no cap:
LWG 227β applied to C++98; behavior as published:Twas not required to beCopyConstructibleorDefaultConstructible(a temporary object of typeTmight not be able to be constructed); correct behavior:Tis also required to beCopyConstructible.LWG 809β applied to C++98; behavior as published: arrays could not be swapped; correct behavior: added overload (2).LWG 2554β applied to C++11; behavior as published: swapping multi-dimensional arrays can never benoexceptdue to name lookup problems; correct behavior: made to work.
π¦ See also π¦
ranges::swap(C++20)β swaps the values of two objects (customization point object).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).
π Category π
conditionally noexcept
okay thatβs the whole page, bestie π«Ά β source/version/date vibes: cppreference.com, 2024.06.10, std::swap(3). mwah πβ¨
π¦ where this page comes from
- nixpkgs unstable: stdman 2024.07.05
- opensuse-leap 16.0: stdman 2024.07.05-bp160.1.9 Β· MIT
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms