[ Web Proxy ]
URL:
Viewing: https://en.cppreference.com/cpp/algorithm/rotate_copy [Back]  [Original]

std::rotate_copy - cppreference.com
cppreference.com
Namespaces
Variants

std::rotate_copy

From cppreference.com
 
 
Algorithm library
Constrained algorithms and algorithms on ranges (C++20)
Constrained algorithms, e.g. ranges::copy, ranges::sort, ...
Non-modifying sequence operations    
Batch operations
(C++17)
Search operations
Modifying sequence operations
Copy operations
(C++11)
(C++11)
Swap operations
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
(C++11)    

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


 
Defined in header <algorithm>
template< class ForwardIt, class OutputIt >
OutputIt rotate_copy( ForwardIt first, ForwardIt middle,
                      ForwardIt last, OutputIt d_first );
(1) (constexpr since C++20)
template< class ExecutionPolicy,
          class ForwardIt1, class ForwardIt2 >
ForwardIt2 rotate_copy( ExecutionPolicy&& policy,
                        ForwardIt1 first, ForwardIt1 middle,
                        ForwardIt1 last, ForwardIt2 d_first );
(2) (since C++17)
1) Copies elements from the source range [firstlast) to the destination range beginning at d_first in rotated order. In the destination range, the elements originally in [firstmiddle) are placed after the elements originally in [middlelast) while the orders of the elements in both ranges are preserved.
2) Same as (1), but executed according to policy.
This overload participates in overload resolution only if the value of the following expression is true:

std::is_execution_policy_v<std::decay_t<ExecutionPolicy>>

(until C++20)

std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>>

(since C++20)

If any of the following conditions is satisfied, the behavior is undefined:

  • [firstmiddle) or [middlelast) is not a valid range.
  • The source and destination ranges overlap.

Parameters

first, last - the pair of iterators defining the source range
middle - the beginning of the part that should appear at the beginning of the destination range
d_first - the beginning of the destination range
policy - the execution policy to use
Type requirements
-
ForwardIt, ForwardIt1, ForwardIt2 must meet the requirements of LegacyForwardIterator.
-
OutputIt must meet the requirements of LegacyOutputIterator.

Return value

The past-the-end iterator of the destination range.

Complexity

Exactly std::distance(first, last) assignments.

Exceptions

2) During the execution process:
  • If the temporary memory resources required for parallelization are not available, std::bad_alloc is thrown.
  • If an uncaught exception is thrown while accessing objects via an algorithm argument, the behavior is determined by the execution policy (for standard policies, std::terminate is invoked).

Possible implementation

See also the implementations in libstdc++, libc++, and MSVC STL.

template<class ForwardIt, class OutputIt>
constexpr // since C++20
OutputIt rotate_copy(ForwardIt first, ForwardIt middle,
                     ForwardIt last, OutputIt d_first)
{
    d_first = std::copy(middle, last, d_first);
    return std::copy(first, middle, d_first);
}

Example

#include <algorithm>
#include <iostream>
#include <iterator>
#include <vector>

int main()
{
    std::vector<int> src{1, 2, 3, 4, 5};
    std::vector<int> dest(src.size());
    auto pivot = std::find(src.begin(), src.end(), 3);
    
    std::rotate_copy(src.begin(), pivot, src.end(), dest.begin());
    for (int i : dest)
        std::cout << i << ' ';
    std::cout << '\n';
    
    // copy the rotation result directly to the std::cout
    pivot = std::find(dest.begin(), dest.end(), 1);
    std::rotate_copy(dest.begin(), pivot, dest.end(),
                     std::ostream_iterator<int>(std::cout, " "));
    std::cout << '\n';
}

Output:

3 4 5 1 2
1 2 3 4 5

See also

copies and rotate a range of elements
(algorithm function object)[edit]
rotates the order of elements in a range
(function template & algorithm function object)[edit]

Web Proxy Viewer  |  New URL  |  Original Page