std::swap_ranges
From cppreference.com
| Defined in header <algorithm>
|
||
template< class ForwardIt1, class ForwardIt2 > ForwardIt2 swap_ranges( ForwardIt1 first1, ForwardIt1 last1, ForwardIt2 first2 ); |
(1) | (constexpr since C++20) |
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2 > ForwardIt2 swap_ranges( ExecutionPolicy&& policy, ForwardIt1 first1, ForwardIt1 last1, ForwardIt2 first2 ); |
(2) | (since C++17) |
1) Exchanges elements between range
[first1, last1) and another range of std::distance(first1, last1) elements starting at first2.2) Same as (1), but executed according to
policy. This overload participates in overload resolution only if all following conditions are satisfied:
|
|
(until C++20) |
|
|
(since C++20) |
If any of the following conditions is satisfied, the behavior is undefined:
- The two ranges overlap.
- There exists a pair of corresponding iterators
iter1anditer2in the two ranges such that*iter1is not Swappable with*iter2.
Parameters
| first1, last1 | - | the pair of iterators defining the range of elements to swap |
| first2 | - | beginning of the second range of elements to swap |
| policy | - | the execution policy to use |
| Type requirements | ||
-ForwardIt1, ForwardIt2 must meet the requirements of LegacyForwardIterator.
| ||
Return value
Iterator to the element past the last element exchanged in the range beginning with first2.
Complexity
Exactly std::distance(first1, last1) swaps.
Exceptions
The overload with a template parameter named ExecutionPolicy reports errors as follows:
- If execution of a function invoked as part of the algorithm throws an exception and
ExecutionPolicyis one of the standard policies, std::terminate is called. For any otherExecutionPolicy, the behavior is implementation-defined. - If the algorithm fails to allocate memory, std::bad_alloc is thrown.
Notes
Implementations (e.g. MSVC STL) may enable vectorization when the iterator type satisfies LegacyContiguousIterator and swapping its value type calls neither non-trivial special member function nor ADL-found swap.
Possible implementation
template<class ForwardIt1, class ForwardIt2>
constexpr //< since C++20
ForwardIt2 swap_ranges(ForwardIt1 first1, ForwardIt1 last1, ForwardIt2 first2)
{
for (; first1 != last1; ++first1, ++first2)
std::iter_swap(first1, first2);
return first2;
}
|
Example
Demonstrates swapping of subranges from different containers.
Run this code
#include <algorithm>
#include <iostream>
#include <list>
#include <vector>
auto print = [](auto comment, auto const& seq)
{
std::cout << comment;
for (const auto& e : seq)
std::cout << e << ' ';
std::cout << '\n';
};
int main()
{
std::vector<char> v{'a', 'b', 'c', 'd', 'e'};
std::list<char> l{'1', '2', '3', '4', '5'};
print("Before swap_ranges:\n" "v: ", v);
print("l: ", l);
std::swap_ranges(v.begin(), v.begin() + 3, l.begin());
print("After swap_ranges:\n" "v: ", v);
print("l: ", l);
}
Output:
Before swap_ranges:
v: a b c d e
l: 1 2 3 4 5
After swap_ranges:
v: 1 2 3 d e
l: a b c 4 5
See also
| swaps the elements pointed to by two iterators (function template) | |
| swaps the values of two objects (function template) | |
(C++20) |
swaps two ranges of elements (algorithm function object) |