Skip to main content

std::copy_n() algorithm

// (1)
template< class InputIt, class Size, class OutputIt >
constexpr OutputIt copy_n( InputIt first, Size count, OutputIt result );

// (2)
template< class ExecutionPolicy, class ForwardIt1, class Size, class ForwardIt2 >
ForwardIt2 copy_n( ExecutionPolicy&& policy,
ForwardIt1 first, Size count, ForwardIt2 result );

Copies count elements from a range to a new location.

  • (1) Copies exactly count values from the range beginning at first to the range beginning at result. Formally, for each integer 0 ≤ i < count, performs *(result + i) = *(first + i).

    warning

    Overlap of ranges is formally permitted, but leads to unpredictable ordering of the results.

  • (2) Same as (1), but executed according to policy.

    Overload Resolution

    These overloads participate in overload resolution only if 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) is true.

Parameters

first

The beginning of the range to copy from.

count

Number of elements to copy.

result

The beginning of the destination range.

policy

The execution policy to use. See execution policy for details.

Type requirements

InputItLegacyInputIterator
OutputItLegacyOutputIterator
ForwardIt1
ForwardIt2
LegacyForwardIterator

Return value

Iterator in the destination range, pointing past the last element copied if count > 0 or result otherwise.

Complexity

  • if count < 0 - zero assignments
  • count assignments otherwise.

Exceptions

The overloads with a template parameter named ExecutionPolicy report 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

copy_n (1)

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;
}

Examples

Main.cpp
#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
This article originates from this CppReference page. It was likely altered for improvements or editors' preference. Click "Edit this page" to see all changes made to this document.
Hover to see the original license.

std::copy_n() algorithm

// (1)
template< class InputIt, class Size, class OutputIt >
constexpr OutputIt copy_n( InputIt first, Size count, OutputIt result );

// (2)
template< class ExecutionPolicy, class ForwardIt1, class Size, class ForwardIt2 >
ForwardIt2 copy_n( ExecutionPolicy&& policy,
ForwardIt1 first, Size count, ForwardIt2 result );

Copies count elements from a range to a new location.

  • (1) Copies exactly count values from the range beginning at first to the range beginning at result. Formally, for each integer 0 ≤ i < count, performs *(result + i) = *(first + i).

    warning

    Overlap of ranges is formally permitted, but leads to unpredictable ordering of the results.

  • (2) Same as (1), but executed according to policy.

    Overload Resolution

    These overloads participate in overload resolution only if 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) is true.

Parameters

first

The beginning of the range to copy from.

count

Number of elements to copy.

result

The beginning of the destination range.

policy

The execution policy to use. See execution policy for details.

Type requirements

InputItLegacyInputIterator
OutputItLegacyOutputIterator
ForwardIt1
ForwardIt2
LegacyForwardIterator

Return value

Iterator in the destination range, pointing past the last element copied if count > 0 or result otherwise.

Complexity

  • if count < 0 - zero assignments
  • count assignments otherwise.

Exceptions

The overloads with a template parameter named ExecutionPolicy report 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

copy_n (1)

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;
}

Examples

Main.cpp
#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
This article originates from this CppReference page. It was likely altered for improvements or editors' preference. Click "Edit this page" to see all changes made to this document.
Hover to see the original license.