Namespaces
Variants

std::copy_n

cppreference.net에서
 
 
알고리즘 라이브러리
제약 알고리즘 및 범위 기반 알고리즘 (C++20)
제약 알고리즘, 예: ranges::copy, ranges::sort, ...
정렬 및 관련 연산
분할 연산
(C++11)    

정렬 연산
이진 검색 연산
(분할된 범위에서)
집합 연산 (정렬된 범위에서)
병합 연산 (정렬된 범위에서)
힙 연산
최소/최대 연산
(C++11)
(C++17)
사전식 비교 연산
순열 연산


 
헤더 <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인 경우에만 오버로드 해결에 참여합니다:

std::is_execution_policy_v<std::decay_t<ExecutionPolicy>>

(C++20까지)

std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>>

(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

참고 항목

요소 범위를 새 위치에 복사합니다
(함수 템플릿 &알고리즘 함수 객체)
여러 요소를 새 위치에 복사합니다
(알고리즘 함수 객체)