std::copy_n
cppreference.net에서
| 헤더 <algorithm>
|
||
template< class InputIt, class Size, class OutputIt >
OutputIt copy_n( InputIt first, Size count, OutputIt result );
|
에 정의됨 (1) | (C++11부터) (C++20부터 constexpr) |
template< class ExecutionPolicy,
class ForwardIt1, class Size, class ForwardIt2 >
ForwardIt2 copy_n( ExecutionPolicy&& policy,
ForwardIt1 first, Size count, ForwardIt2 result );
|
(2) | (C++17부터) |
1)
count에서 시작하는 범위로부터 first에서 시작하는 범위로 정확히 result 개의 값을 복사합니다. 공식적으로, i의 각 정수 [0, count)에 대해 *(result + i) = *(first + i)를 수행합니다.범위의 중복은 공식적으로 허용되지만, 결과의 순서를 예측할 수 없게 만듭니다.
2) (1)과 동일하지만,
policy에 따라 실행됩니다.이 오버로드는 다음 표현식의 값이
true인 경우에만 오버로드 해결에 참여합니다:
|
|
(C++20까지) |
|
|
(C++20부터) |
매개변수
| first | - | 복사할 요소 범위의 시작 |
| count | - | 복사할 요소의 개수 |
| result | - | 대상 범위의 시작 |
| policy | - | 사용할 실행 정책 |
| 형식 요구 사항 | ||
-InputIt는 LegacyInputIterator의 요구 사항을 충족해야 합니다.
| ||
-OutputIt는 LegacyOutputIterator의 요구 사항을 충족해야 합니다.
| ||
-ForwardIt1, ForwardIt2는 LegacyForwardIterator의 요구 사항을 충족해야 합니다.
| ||
반환값
count > 0인 경우 대상 범위에서 마지막으로 복사된 요소 다음을 가리키는 반복자, 그렇지 않으면 result.
복잡도
count < 0인 경우 할당 없음; 그렇지 않으면 count 번의 할당.
예외
템플릿 매개변수 이름이 ExecutionPolicy인 오버로드는 다음과 같이 오류를 보고합니다:
- 알고리즘의 일부로 호출된 함수가 예외를 던지고
ExecutionPolicy이(가) 표준 정책 중 하나이면 std::terminate가 호출됩니다. 다른ExecutionPolicy의 경우, 동작은 구현 정의입니다. - 알고리즘이 메모리 할당에 실패하면 std::bad_alloc이 던져집니다.
가능한 구현
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, (void)++result)
*result = *++first;
}
return result;
}
|
예제
이 코드 실행하기
#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
참고 항목
(C++11) |
요소 범위를 새 위치에 복사합니다 (함수 템플릿 &알고리즘 함수 객체) |
(C++20)(C++20) |
|
(C++20) |
여러 요소를 새 위치에 복사합니다 (알고리즘 함수 객체) |