Namespaces
Variants
Views
Actions

Difference between revisions of "cpp/algorithm/swap"

From cppreference.com
< cpp‎ | algorithm
(minor formatting)
m (Shorten template names. Use {{lc}} where appropriate.)
Line 1: Line 1:
 
{{cpp/title|swap}}
 
{{cpp/title|swap}}
 
{{cpp/algorithm/navbar}}
 
{{cpp/algorithm/navbar}}
{{ddcl list begin}}
+
{{dcl begin}}
{{ddcl list header | algorithm | utility | notes={{mark until c++11}}<br>{{mark since c++11}}}}
+
{{dcl header | algorithm | utility | notes={{mark until c++11}}<br>{{mark since c++11}}}}
{{ddcl list item | num=1 |
+
{{dcl | num=1 |
 
template< class T >
 
template< class T >
 
void swap( T& a, T& b );
 
void swap( T& a, T& b );
 
}}
 
}}
{{ddcl list item | num=2 | notes={{mark since c++11}} |
+
{{dcl | num=2 | notes={{mark since c++11}} |
 
template< class T2, size_t N >
 
template< class T2, size_t N >
 
void swap( T2 (&a)[N], T2 (&b)[N]);
 
void swap( T2 (&a)[N], T2 (&b)[N]);
 
}}
 
}}
{{ddcl list end}}
+
{{dcl end}}
  
 
Exchanges the given values.
 
Exchanges the given values.
Line 20: Line 20:
  
 
===Parameters===
 
===Parameters===
{{param list begin}}
+
{{par begin}}
{{param list item | a, b | the values to be swapped}}
+
{{par | a, b | the values to be swapped}}
{{param list hreq}}
+
{{par hreq}}
{{param list req concept | T | MoveConstructible | MoveAssignable}}
+
{{par req concept | T | MoveConstructible | MoveAssignable}}
{{param list req concept | T2 | Swappable }}
+
{{par req concept | T2 | Swappable }}
{{param list end}}
+
{{par end}}
  
 
===Return value===
 
===Return value===
Line 45: Line 45:
 
===Specializations===
 
===Specializations===
  
Both custom specializations and overloads of the {{c|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 {{concept|Swappable}} concept).
+
Both custom specializations and overloads of the {{lc|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 {{concept|Swappable}} concept).
  
 
The following overloads are already provided by the standard library:
 
The following overloads are already provided by the standard library:
  
{{dcl list begin}}
+
{{dsc begin}}
{{dcl list template | cpp/utility/pair/dcl list swap2}}
+
{{dsc inc | cpp/utility/pair/dcl list swap2}}
{{dcl list template | cpp/utility/tuple/dcl list swap2}}
+
{{dsc inc | cpp/utility/tuple/dcl list swap2}}
{{dcl list template | cpp/memory/shared_ptr/dcl list swap2}}
+
{{dsc inc | cpp/memory/shared_ptr/dcl list swap2}}
{{dcl list template | cpp/memory/weak_ptr/dcl list swap2}}
+
{{dsc inc | cpp/memory/weak_ptr/dcl list swap2}}
{{dcl list template | cpp/memory/unique_ptr/dcl list swap2}}
+
{{dsc inc | cpp/memory/unique_ptr/dcl list swap2}}
{{dcl list template | cpp/utility/functional/function/dcl list swap2}}
+
{{dsc inc | cpp/utility/functional/function/dcl list swap2}}
{{dcl list template | cpp/string/basic_string/dcl list swap2}}
+
{{dsc inc | cpp/string/basic_string/dcl list swap2}}
{{dcl list template | cpp/container/dcl list swap2 | array}}
+
{{dsc inc | cpp/container/dcl list swap2 | array}}
{{dcl list template | cpp/container/dcl list swap2 | deque}}
+
{{dsc inc | cpp/container/dcl list swap2 | deque}}
{{dcl list template | cpp/container/dcl list swap2 | forward_list}}
+
{{dsc inc | cpp/container/dcl list swap2 | forward_list}}
{{dcl list template | cpp/container/dcl list swap2 | list}}
+
{{dsc inc | cpp/container/dcl list swap2 | list}}
{{dcl list template | cpp/container/dcl list swap2 | vector}}
+
{{dsc inc | cpp/container/dcl list swap2 | vector}}
{{dcl list template | cpp/container/dcl list swap2 | map}}
+
{{dsc inc | cpp/container/dcl list swap2 | map}}
{{dcl list template | cpp/container/dcl list swap2 | multimap}}
+
{{dsc inc | cpp/container/dcl list swap2 | multimap}}
{{dcl list template | cpp/container/dcl list swap2 | set}}
+
{{dsc inc | cpp/container/dcl list swap2 | set}}
{{dcl list template | cpp/container/dcl list swap2 | multiset}}
+
{{dsc inc | cpp/container/dcl list swap2 | multiset}}
{{dcl list template | cpp/container/dcl list swap2 | unordered_map}}
+
{{dsc inc | cpp/container/dcl list swap2 | unordered_map}}
{{dcl list template | cpp/container/dcl list swap2 | unordered_multimap}}
+
{{dsc inc | cpp/container/dcl list swap2 | unordered_multimap}}
{{dcl list template | cpp/container/dcl list swap2 | unordered_set}}
+
{{dsc inc | cpp/container/dcl list swap2 | unordered_set}}
{{dcl list template | cpp/container/dcl list swap2 | unordered_multiset}}
+
{{dsc inc | cpp/container/dcl list swap2 | unordered_multiset}}
{{dcl list template | cpp/container/dcl list swap2 | queue}}
+
{{dsc inc | cpp/container/dcl list swap2 | queue}}
{{dcl list template | cpp/container/dcl list swap2 | priority_queue}}
+
{{dsc inc | cpp/container/dcl list swap2 | priority_queue}}
{{dcl list template | cpp/container/dcl list swap2 | stack}}
+
{{dsc inc | cpp/container/dcl list swap2 | stack}}
{{dcl list tfun | cpp/numeric/valarray/swap2 | title=std::swap{{dcl small|(std::valarray)}} | specializes the {{cpp/ltf|cpp/algorithm/swap}} algorithm| notes={{mark c++11}}}}
+
{{dsc tfun | cpp/numeric/valarray/swap2 | title=std::swap{{dsc small|(std::valarray)}} | specializes the {{cpp/ltf|cpp/algorithm/swap}} algorithm| notes={{mark c++11}}}}
{{dcl list tfun | cpp/io/basic_stringbuf/swap2 | title=std::swap{{dcl small|(std::basic_stringbuf)}} | specializes the {{cpp/ltf|cpp/algorithm/swap}} algorithm| notes={{mark c++11}}}}
+
{{dsc tfun | cpp/io/basic_stringbuf/swap2 | title=std::swap{{dsc small|(std::basic_stringbuf)}} | specializes the {{cpp/ltf|cpp/algorithm/swap}} algorithm| notes={{mark c++11}}}}
{{dcl list tfun | cpp/io/basic_istringstream/swap2 | title=std::swap{{dcl small|(std::basic_istringstream)}} | specializes the {{cpp/ltf|cpp/algorithm/swap}} algorithm| notes={{mark c++11}}}}
+
{{dsc tfun | cpp/io/basic_istringstream/swap2 | title=std::swap{{dsc small|(std::basic_istringstream)}} | specializes the {{cpp/ltf|cpp/algorithm/swap}} algorithm| notes={{mark c++11}}}}
{{dcl list tfun | cpp/io/basic_ostringstream/swap2 | title=std::swap{{dcl small|(std::basic_ostringstream)}} | specializes the {{cpp/ltf|cpp/algorithm/swap}} algorithm| notes={{mark c++11}}}}
+
{{dsc tfun | cpp/io/basic_ostringstream/swap2 | title=std::swap{{dsc small|(std::basic_ostringstream)}} | specializes the {{cpp/ltf|cpp/algorithm/swap}} algorithm| notes={{mark c++11}}}}
{{dcl list tfun | cpp/io/basic_stringstream/swap2 | title=std::swap{{dcl small|(std::basic_stringstream)}} | specializes the {{cpp/ltf|cpp/algorithm/swap}} algorithm| notes={{mark c++11}}}}
+
{{dsc tfun | cpp/io/basic_stringstream/swap2 | title=std::swap{{dsc small|(std::basic_stringstream)}} | specializes the {{cpp/ltf|cpp/algorithm/swap}} algorithm| notes={{mark c++11}}}}
{{dcl list tfun | cpp/io/basic_filebuf/swap2 | title=std::swap{{dcl small|(std::basic_filebuf)}} | specializes the {{cpp/ltf|cpp/algorithm/swap}} algorithm| notes={{mark c++11}}}}
+
{{dsc tfun | cpp/io/basic_filebuf/swap2 | title=std::swap{{dsc small|(std::basic_filebuf)}} | specializes the {{cpp/ltf|cpp/algorithm/swap}} algorithm| notes={{mark c++11}}}}
{{dcl list template | cpp/io/basic_fstream/dcl list swap2 | basic_ifstream}}
+
{{dsc inc | cpp/io/basic_fstream/dcl list swap2 | basic_ifstream}}
{{dcl list template | cpp/io/basic_fstream/dcl list swap2 | basic_ofstream}}
+
{{dsc inc | cpp/io/basic_fstream/dcl list swap2 | basic_ofstream}}
{{dcl list template | cpp/io/basic_fstream/dcl list swap2 | basic_fstream}}
+
{{dsc inc | cpp/io/basic_fstream/dcl list swap2 | basic_fstream}}
{{dcl list tfun | cpp/regex/basic_regex/swap2 | title=std::swap{{dcl small|(std::basic_regex)}} | specializes the {{cpp/ltf|cpp/algorithm/swap}} algorithm| notes={{mark c++11}}}}
+
{{dsc tfun | cpp/regex/basic_regex/swap2 | title=std::swap{{dsc small|(std::basic_regex)}} | specializes the {{cpp/ltf|cpp/algorithm/swap}} algorithm| notes={{mark c++11}}}}
{{dcl list tfun | cpp/regex/match_results/swap2 | title=std::swap{{dcl small|(std::match_results)}} | specializes the {{cpp/ltf|cpp/algorithm/swap}} algorithm| notes={{mark c++11}}}}
+
{{dsc tfun | cpp/regex/match_results/swap2 | title=std::swap{{dsc small|(std::match_results)}} | specializes the {{cpp/ltf|cpp/algorithm/swap}} algorithm| notes={{mark c++11}}}}
{{dcl list template | cpp/thread/thread/dcl list swap2}}
+
{{dsc inc | cpp/thread/thread/dcl list swap2}}
{{dcl list tfun | cpp/thread/unique_lock/swap2 | title=std::swap{{dcl small|(std::unique_lock)}} | specializes the {{cpp/ltf|cpp/algorithm/swap}} algorithm| notes={{mark c++11}}}}
+
{{dsc tfun | cpp/thread/unique_lock/swap2 | title=std::swap{{dsc small|(std::unique_lock)}} | specializes the {{cpp/ltf|cpp/algorithm/swap}} algorithm| notes={{mark c++11}}}}
{{dcl list tfun | cpp/thread/promise/swap2 | title=std::swap{{dcl small|(std::promise)}} | specializes the {{cpp/ltf|cpp/algorithm/swap}} algorithm| notes={{mark c++11}}}}
+
{{dsc tfun | cpp/thread/promise/swap2 | title=std::swap{{dsc small|(std::promise)}} | specializes the {{cpp/ltf|cpp/algorithm/swap}} algorithm| notes={{mark c++11}}}}
{{dcl list tfun | cpp/thread/packaged_task/swap2 | title=std::swap{{dcl small|(std::packaged_task)}} | specializes the {{cpp/ltf|cpp/algorithm/swap}} algorithm| notes={{mark c++11}}}}
+
{{dsc tfun | cpp/thread/packaged_task/swap2 | title=std::swap{{dsc small|(std::packaged_task)}} | specializes the {{cpp/ltf|cpp/algorithm/swap}} algorithm| notes={{mark c++11}}}}
{{dcl list end}}
+
{{dsc end}}
  
 
===Example===
 
===Example===
Line 115: Line 115:
  
 
===See also===
 
===See also===
{{dcl list begin}}
+
{{dsc begin}}
{{dcl list template | cpp/algorithm/dcl list iter_swap}}
+
{{dsc inc | cpp/algorithm/dcl list iter_swap}}
{{dcl list template | cpp/algorithm/dcl list swap_ranges}}
+
{{dsc inc | cpp/algorithm/dcl list swap_ranges}}
{{dcl list end}}
+
{{dsc end}}
  
 
[[de:cpp/algorithm/swap]]
 
[[de:cpp/algorithm/swap]]

Revision as of 17:49, 31 May 2013

 
 
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>
Defined in header <utility>
(until C++11)
(since C++11)
template< class T >
void swap( T& a, T& b );
(1)
template< class T2, 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.

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

Template:par req concept Template:par req concept

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 Template:concept 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)
({{{1}}})
specializes the std::swap algorithm
(function) [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