std::copy_n() algorithm
- od C++20
- od C++17
- od C++11
// (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 );
// (1)
template< class InputIt, class Size, class OutputIt >
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 );
// (1)
template< class InputIt, class Size, class OutputIt >
OutputIt copy_n( InputIt first, Size count, OutputIt result );
Copies count
elements from a range to a new location.
-
(1) Copies exactly
count
values from the range beginning atfirst
to the range beginning atresult
. Formally, for each integer0 ≤ i < count
, performs*(result + i) = *(first + i)
.warningOverlap of ranges is formally permitted, but leads to unpredictable ordering of the results.
-
(2) Same as (1), but executed according to policy.
Overload ResolutionThese overloads participate in overload resolution only if
std::is_execution_policy_v<std::decay_t<ExecutionPolicy>>
(do C++20)std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>>
(od C++20) istrue
.
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
InputIt | LegacyInputIterator |
OutputIt | LegacyOutputIterator |
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 otherExecutionPolicy
, 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
#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';
}
1234
5050
Hover to see the original license.