Files
cppdraft_translate/cppdraft/alg/rotate.md
2025-10-25 03:02:53 +03:00

12 KiB
Raw Blame History

[alg.rotate]

26 Algorithms library [algorithms]

26.7 Mutating sequence operations [alg.modifying.operations]

26.7.11 Rotate [alg.rotate]

🔗

`template constexpr ForwardIterator rotate(ForwardIterator first, ForwardIterator middle, ForwardIterator last); template<class ExecutionPolicy, class ForwardIterator> ForwardIterator rotate(ExecutionPolicy&& exec, ForwardIterator first, ForwardIterator middle, ForwardIterator last);

template<permutable I, sentinel_for S> constexpr subrange ranges::rotate(I first, I middle, S last); template<execution-policy Ep, random_access_iterator I, sized_sentinel_for S> requires permutable subrange ranges::rotate(Ep&& exec, I first, I middle, S last); `

1

#

Preconditions: [first, middle) and [middle, last) are valid ranges.

For the overloads in namespace std,ForwardIterator meets the Cpp17ValueSwappable requirements ([swappable.requirements]), and the type of *first meets the Cpp17MoveConstructible (Table 31) andCpp17MoveAssignable (Table 33) requirements.

2

#

Effects: For each non-negative integer i < (last - first), places the element from the position first + i into position first + (i + (last - middle)) % (last - first).

[Note 1:

This is a left rotate.

— end note]

3

#

Returns:

  • (3.1)

    first + (last - middle) for the overloads in namespace std.

  • (3.2)

    {first + (last - middle), last} for the overload in namespace ranges.

4

#

Complexity: At most last - first swaps.

🔗

template<[forward_range](range.refinements#concept:forward_range "25.4.6Other range refinements[range.refinements]") R> requires [permutable](alg.req.permutable#concept:permutable "24.3.7.6Concept permutable[alg.req.permutable]")<iterator_t<R>> constexpr borrowed_subrange_t<R> ranges::rotate(R&& r, iterator_t<R> middle);

5

#

Effects: Equivalent to:return ranges::rotate(ranges::begin(r), middle, ranges::end(r));

🔗

template<[execution-policy](algorithms.parallel.defns#concept:execution-policy "26.3.1Preamble[algorithms.parallel.defns]") Ep, [sized-random-access-range](range.refinements#concept:sized-random-access-range "25.4.6Other range refinements[range.refinements]") R> requires [permutable](alg.req.permutable#concept:permutable "24.3.7.6Concept permutable[alg.req.permutable]")<iterator_t<R>> borrowed_subrange_t<R> ranges::rotate(Ep&& exec, R&& r, iterator_t<R> middle);

6

#

Effects: Equivalent to:return ranges::rotate(std::forward(exec), ranges::begin(r), middle, ranges::end(r));

🔗

`template<class ForwardIterator, class OutputIterator> constexpr OutputIterator rotate_copy(ForwardIterator first, ForwardIterator middle, ForwardIterator last, OutputIterator result); template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2> ForwardIterator2 rotate_copy(ExecutionPolicy&& exec, ForwardIterator1 first, ForwardIterator1 middle, ForwardIterator1 last, ForwardIterator2 result);

template<forward_iterator I, sentinel_for S, weakly_incrementable O> requires indirectly_copyable<I, O> constexpr ranges::rotate_copy_result<I, O> ranges::rotate_copy(I first, I middle, S last, O result); `

7

#

Let N be last - first.

8

#

Preconditions: [first, middle) and [middle, last) are valid ranges.

The ranges [first, last) and [result, result + N) do not overlap.

9

#

Effects: Copies the range [first, last) to the range [result, result + N) such that for each non-negative integer i<N the following assignment takes place:*(result + i) = *(first + (i + (middle - first)) % N).

10

#

Returns:

  • (10.1)

    result + N for the overloads in namespace std.

  • (10.2)

    {last, result + N} for the overload in namespace ranges.

11

#

Complexity: Exactly N assignments.

🔗

template<[execution-policy](algorithms.parallel.defns#concept:execution-policy "26.3.1Preamble[algorithms.parallel.defns]") Ep, [random_access_iterator](iterator.concept.random.access#concept:random_access_iterator "24.3.4.13Concept random_­access_­iterator[iterator.concept.random.access]") I, [sized_sentinel_for](iterator.concept.sizedsentinel#concept:sized_sentinel_for "24.3.4.8Concept sized_­sentinel_­for[iterator.concept.sizedsentinel]")<I> S, [random_access_iterator](iterator.concept.random.access#concept:random_access_iterator "24.3.4.13Concept random_­access_­iterator[iterator.concept.random.access]") O, [sized_sentinel_for](iterator.concept.sizedsentinel#concept:sized_sentinel_for "24.3.4.8Concept sized_­sentinel_­for[iterator.concept.sizedsentinel]")<O> OutS> requires [indirectly_copyable](alg.req.ind.copy#concept:indirectly_copyable "24.3.7.3Concept indirectly_­copyable[alg.req.ind.copy]")<I, O> ranges::rotate_copy_truncated_result<I, O> ranges::rotate_copy(Ep&& exec, I first, I middle, S last, O result, OutS result_last);

12

#

Let M be last - first and N be min(M, result_last - result).

13

#

Preconditions: [first, middle) and [middle, last) are valid ranges.

The ranges [first, last) and [result, result + N) do not overlap.

14

#

Effects: Copies the range [first, last) to the range [result, result + N) such that for each non-negative integer i<N the following assignment takes place:*(result + i) = *(first + (i + (middle - first)) % M).

15

#

Returns:

  • (15.1)

    {middle + N, first, result + N} if N is less than last - middle.

  • (15.2)

    Otherwise, {last, first + (N + (middle - first)) % M, result + N}.

16

#

Complexity: Exactly N assignments.

🔗

template<[forward_range](range.refinements#concept:forward_range "25.4.6Other range refinements[range.refinements]") R, [weakly_incrementable](iterator.concept.winc#concept:weakly_incrementable "24.3.4.4Concept weakly_­incrementable[iterator.concept.winc]") O> requires [indirectly_copyable](alg.req.ind.copy#concept:indirectly_copyable "24.3.7.3Concept indirectly_­copyable[alg.req.ind.copy]")<iterator_t<R>, O> constexpr ranges::rotate_copy_result<borrowed_iterator_t<R>, O> ranges::rotate_copy(R&& r, iterator_t<R> middle, O result);

17

#

Effects: Equivalent to:return ranges::rotate_copy(ranges::begin(r), middle, ranges::end(r), std::move(result));

🔗

template<[execution-policy](algorithms.parallel.defns#concept:execution-policy "26.3.1Preamble[algorithms.parallel.defns]") Ep, [sized-random-access-range](range.refinements#concept:sized-random-access-range "25.4.6Other range refinements[range.refinements]") R, [sized-random-access-range](range.refinements#concept:sized-random-access-range "25.4.6Other range refinements[range.refinements]") OutR> requires [indirectly_copyable](alg.req.ind.copy#concept:indirectly_copyable "24.3.7.3Concept indirectly_­copyable[alg.req.ind.copy]")<iterator_t<R>, iterator_t<OutR>> ranges::rotate_copy_truncated_result<borrowed_iterator_t<R>, borrowed_iterator_t<OutR>> ranges::rotate_copy(Ep&& exec, R&& r, iterator_t<R> middle, OutR&& result_r);

18

#

Effects: Equivalent to:return ranges::rotate_copy(std::forward(exec), ranges::begin(r), middle, ranges::end(r), ranges::begin(result_r), ranges::end(result_r));