std::rotate_copy(3)

πŸ“¦ version 2024.07.05, in nixpkgs unstable, opensuse-leap 16.0

πŸ’… std::rotate_copy(3) πŸ’…

okay so bestie, welcome to the <pink>std::rotate_copy</pink> page from the C++ Standard Libary manual ✨ (yes, that’s the manual name, typo and all β€” we don’t fix, we report πŸ’…). This one is lowkey giving β€œcopy my range but start from this one spot” energy, and honestly? iconic πŸŒ€πŸ’–.

🌸 NAME 🌸

std::rotate_copy - std::rotate_copy β€” that's it, that's the NAME section, and it ate πŸ’…βœ¨.

✨ Synopsis ✨

Defined in header <algorithm>:

template< class ForwardIt, class OutputIt >
OutputIt rotate_copy( ForwardIt first, ForwardIt n_first,
                      ForwardIt last, OutputIt d_first );
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2 >
ForwardIt2 rotate_copy( ExecutionPolicy&& policy, ForwardIt1 first,
                        ForwardIt1 n_first, ForwardIt1 last, ForwardIt2 d_first );
  • (1) β€” constexpr since C++20 ⭐
  • (2) β€” since C++17 πŸ¦‹

so overload (1) copies the elements from the range [first, last) to another range beginning at d_first, in such a way that the element *(n_first) becomes the first element of the new range and *(n_first - 1) becomes the last element. no cap, that’s the whole rotation-copy moment ✨.

overload (2) is same as (1), but executed according to policy. This overload participates in overload resolution only if std::is_execution_policy_v<std::decay_t<ExecutionPolicy>> is true. (until C++20) std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>> is true. (since C++20) 🫢

🚨 vibe check: undefined behavior alert 🚨 if any of the following conditions is satisfied, the behavior is undefined: - [first, n_first) or [n_first, last) is not a valid range. - The source and destination ranges overlap.

πŸ’– Parameters πŸ’–

  • first, last β€” the range of elements to copy πŸ“‹
  • n_first β€” an iterator to an element in [first, last) that should appear at the beginning of the new range. it’s the pivot, the main character, the β€œstart here bestie” iterator πŸ‘‘
  • d_first β€” beginning of the destination range 🎯
  • policy β€” the execution policy to use. See execution policy for details. 🧚

πŸ¦‹ Type requirements πŸ¦‹

  • ForwardIt, ForwardIt1, ForwardIt2 must meet the requirements of LegacyForwardIterator.
  • OutputIt must meet the requirements of LegacyOutputIterator.

⭐ Return value ⭐

Output iterator to the element past the last element copied. that’s the β€œhere’s where I stopped, bestie” iterator 🫢.

πŸ”₯ Complexity πŸ”₯

Exactly std::distance(first, last) assignments. no more, no less, periodt πŸ’….

😭 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 ExecutionPolicy is one of the standard policies, std::terminate is called. For any other ExecutionPolicy, the behavior is implementation-defined.
  • If the algorithm fails to allocate memory, std::bad_alloc is thrown.

🧚 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 n_first,
                     ForwardIt last, OutputIt d_first)
{
    d_first = std::copy(n_first, last, d_first);
    return std::copy(first, n_first, d_first);
}

πŸ“ Example πŸ“

// Run this code

#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 πŸ‘€

  • rotate β€” rotates the order of elements in a range (function template) πŸ”„
  • ranges::rotate_copy β€” copies and rotate a range of elements (C++20) (niebloid) πŸŒ€

okay that’s the whole page, bestie 🫢 β€” source: http://cppreference.com, version/date: 2024.06.10, page: std::rotate_copy(3) βœ¨πŸ’–

πŸ“¦ where this page comes from