Difference between revisions of "cpp/algorithm/swap"
From cppreference.com
(→See also: add ranges swap) |
Guyutongxue (Talk | contribs) (Add more std::swap/swap overloads) |
||
Line 113: | Line 113: | ||
{{dsc inc | cpp/thread/thread/dsc swap2 | thread}} | {{dsc inc | cpp/thread/thread/dsc swap2 | thread}} | ||
{{dsc inc | cpp/thread/unique_lock/dsc swap2}} | {{dsc inc | cpp/thread/unique_lock/dsc swap2}} | ||
+ | {{dsc inc | cpp/thread/shared_lock/dsc swap2}} | ||
{{dsc inc | cpp/thread/promise/dsc swap2}} | {{dsc inc | cpp/thread/promise/dsc swap2}} | ||
{{dsc inc | cpp/thread/packaged_task/dsc swap2}} | {{dsc inc | cpp/thread/packaged_task/dsc swap2}} | ||
Line 118: | Line 119: | ||
{{dsc inc | cpp/utility/any/dsc swap2}} | {{dsc inc | cpp/utility/any/dsc swap2}} | ||
{{dsc inc | cpp/utility/variant/dsc swap2}} | {{dsc inc | cpp/utility/variant/dsc swap2}} | ||
+ | {{dsc inc | cpp/utility/basic_stacktrace/dsc swap2}} | ||
{{dsc inc | cpp/filesystem/path/dsc swap2}} | {{dsc inc | cpp/filesystem/path/dsc swap2}} | ||
+ | {{dsc inc | cpp/utility/expected/dsc swap2}} | ||
+ | {{dsc inc | cpp/thread/thread/dsc swap2 | jthread}} | ||
+ | {{dsc inc | cpp/utility/functional/move_only_function/dsc swap2}} | ||
+ | {{dsc inc | cpp/thread/stop_source/dsc swap2}} | ||
+ | {{dsc inc | cpp/thread/stop_token/dsc swap2}} | ||
+ | <!--TODOs: | ||
+ | swap(std::flat_map) | ||
+ | swap(std::flat_set) | ||
+ | swap(std::flat_multimap) | ||
+ | swap(std::flat_multiset) | ||
+ | swap(std::unexpected) | ||
+ | swap(std::mdspan) | ||
+ | --> | ||
{{dsc end}} | {{dsc end}} | ||
Revision as of 20:08, 24 August 2022
Defined in header <algorithm>
|
(until C++11) |
|
Defined in header <utility>
|
(since C++11) |
|
Defined in header <string_view>
|
(since C++17) |
|
(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)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)
(none) |
(until C++11) |
noexcept specification:
noexcept( std::is_nothrow_move_constructible<T>::value && |
(since C++11) |
2)
noexcept specification:
The lookup for the identifier noexcept(noexcept(swap(*a, *b))) 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:
noexcept(std::is_nothrow_swappable_v<T2>) |
(since C++17) |
Complexity
1) Constant
2) Linear in
N
Specializations
|
(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:
(C++11) |
specializes the std::swap algorithm (function template) |
(C++11) |
specializes the std::swap algorithm (function template) |
(C++11) |
specializes the std::swap algorithm (function template) |
(C++11) |
specializes the std::swap algorithm (function template) |
(C++11) |
specializes the std::swap algorithm (function template) |
(C++11) |
specializes the std::swap algorithm (function template) |
specializes the std::swap algorithm (function template) | |
(C++11) |
specializes the std::swap algorithm (function template) |
specializes the std::swap algorithm (function template) | |
(C++11) |
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) | |
(C++11) |
specializes the std::swap algorithm (function template) |
specializes the std::swap algorithm (function template) | |
(C++11) |
specializes the std::swap algorithm (function template) |
(C++11) |
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) | |
(C++11) |
specializes the std::swap algorithm (function template) |
specializes the std::swap algorithm (function template) | |
(C++11) |
specializes the std::swap algorithm (function) |
(C++11) |
specializes the std::swap algorithm (function template) |
(C++14) |
specializes the std::swap algorithm (function template) |
(C++11) |
specializes the std::swap algorithm (function template) |
specializes the std::swap algorithm (function template) | |
(C++17) |
specializes the std::swap algorithm (function template) |
(C++17) |
specializes the std::swap algorithm (function) |
(C++17) |
specializes the std::swap algorithm (function template) |
specializes the std::swap algorithm (function template) | |
(C++17) |
specializes the std::swap algorithm (function) |
(C++23) |
specializes the std::swap algorithm (function) |
(C++20) |
specializes the std::swap algorithm (function) |
specializes the std::swap algorithm (function) | |
(C++20) |
specializes the std::swap algorithm (function) |
(C++20) |
specializes the std::swap algorithm (function) |
Example
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
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
(C++20) |
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) |