std::copy_n(3)

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

πŸŽ€ NAME πŸŽ€

This page is std::copy_n(3) from the C++ Standard Libary section of the manual (yes, the header literally spells it β€œLibary,” iconic) πŸ’….

  • std::copy_n β€” std::copy_n

✨ Synopsis ✨

Defined in header <algorithm>.

template< class InputIt, class Size, class OutputIt >        (since C++11)
OutputIt copy_n( InputIt first, Size count, OutputIt result );  (1) (constexpr since C++20)

template< class ExecutionPolicy,
          class ForwardIt1, class Size, class ForwardIt2 >
ForwardIt2 copy_n( ExecutionPolicy&& policy,
                   ForwardIt1 first, Size count,
                   ForwardIt2 result );                         (2) (since C++17)
  1. Copies exactly count values from the range beginning at first to the range beginning at result. Formally, for each integer i in [0, count), performs *(result + i) = *(first + i). Overlap of ranges is formally permitted, but leads to unpredictable ordering of the results 🫠.
  2. 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) And since C++20, the check is std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>> is true. (since C++20)

🌸 Parameters 🌸

  • first β€” the beginning of the range of elements to copy from 🫢
  • count β€” number of the elements to copy πŸ”’
  • result β€” the beginning of the destination range 🎯
  • policy β€” the execution policy to use. See execution policy for details. πŸ•΅οΈβ€β™€οΈ

πŸ’– Type requirements πŸ’–

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

πŸ¦‹ Return value πŸ¦‹

Iterator in the destination range, pointing past the last element copied if count > 0 or result otherwise. Slay πŸ’….

🧚 Complexity 🧚

Zero assignments if count < 0; count assignments otherwise ✨.

πŸ”₯ 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 πŸ’…

template<class InputIt, class Size, class OutputIt>
constexpr //< since C++20
OutputIt copy_n(InputIt first, Size count, OutputIt result)
{
    if (count > 0)
    {
        *result = *first;
        ++result;
        for (Size i = 1; i != count; ++i, ++result)
            *result = *++first;
    }

    return result;
}

🌈 Example 🌈

// Run this code

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

int main()
{
    std::string in {"1234567890"};
    std::string out;

    std::copy_n(in.begin(), 4, std::back_inserter(out));
    std::cout << out << '\n';

    std::vector<int> v_in(128);
    std::iota(v_in.begin(), v_in.end(), 1);
    std::vector<int> v_out(v_in.size());

    std::copy_n(v_in.cbegin(), 100, v_out.begin());
    std::cout << std::accumulate(v_out.begin(), v_out.end(), 0) << '\n';
}

⭐ Output ⭐

1234
5050

πŸ‘‘ See also πŸ‘‘

  • copy β€” copies a range of elements to a new location
  • copy_if β€” (function template) (C++11)
  • ranges::copy_n β€” copies a number of elements to a new location (C++20) (niebloid)

Source/version: http://cppreference.com Β· 2024.06.10 Β· page std::copy_n(3). That’s the footer, bestie β€” now go copy exactly count things and slay πŸ’…βœ¨

πŸ“¦ where this page comes from