std::swap_ranges - cppreference.com (original) (raw)
Exchanges elements between range
[first1,last1)and another range of std::distance(first1, last1) elements starting at first2.Same as (1), but executed according to policy.
This overload participates in overload resolution only if all following conditions are satisfied:
If any of the following conditions is satisfied, the behavior is undefined:
- The two ranges overlap.
- There exists a pair of corresponding iterators iter1 and iter2 in the two ranges such that *iter1 is not Swappable with *iter2.
Contents
- 1 Parameters
- 2 Return value
- 3 Complexity
- 4 Exceptions
- 5 Notes
- 6 Possible implementation
- 7 Example
- 8 See also
[edit] 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. |
[edit] Return value
Iterator to the element past the last element exchanged in the range beginning with first2.
[edit] Complexity
Exactly std::distance(first1, last1) swaps.
[edit] 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.
[edit] 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.
[edit] 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; }
[edit] Example
Demonstrates swapping of subranges from different containers.
#include #include #include #include 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 v{'a', 'b', 'c', 'd', 'e'}; std::list 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