Namespaces
Variants

std::ranges::copy_n, std::ranges::copy_n_result

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

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


 
제약된 알고리즘
이 메뉴의 모든 이름은 네임스페이스 std::ranges
비수정 시퀀스 연산
수정 시퀀스 연산
분할 연산
정렬 연산
이진 검색 연산 (정렬된 범위에서)
       
       
집합 연산 (정렬된 범위에서)
힙 연산
최소/최대 연산
       
       
순열 연산
폴드 연산
수치 연산
(C++23)            
초기화되지 않은 저장소에 대한 연산
반환 타입
 
헤더에 정의됨 <algorithm>
호출 서명
template< std::input_iterator I, std::weakly_incrementable O >
requires std::indirectly_copyable<I, O>
constexpr copy_n_result<I, O>
    copy_n( I first, std::iter_difference_t<I> n, O result );
(1) (since C++20)
헬퍼 타입
template< class I, class O >
using copy_n_result = ranges::in_out_result<I, O>;
(2) (since C++20)
1)다음의 값을 정확히 복사합니다: n값을 다음에서 시작하는 범위에서 first로 시작하는 범위로 result다음을 수행하여: *(result + i) = *(first + i)의 각 정수에 대해[0, n). 동작은 다음의 경우 정의되지 않습니다: result가 범위 내에 있는 경우 [first, first + n) (ranges::copy_backward를 대신 사용할 수 있습니다.)

이 페이지에서 설명하는 함수형 엔티티는 알고리즘 함수 객체 (비공식적으로 알려진 niebloids), 즉:

  • 이들 중 하나를 호출할 때 명시적인 템플릿 인자 목록을 지정할 수 없습니다.
  • 그들 중 어느 것도 다음에 보이지 않습니다: 인자 종속 조회.
  • 그들 중 하나가 다음에 의해 발견되면 일반적인 정규 조회 함수 호출 연산자의 왼쪽에 있는 이름으로 인자 종속 조회가 억제됩니다.

매개변수

first - 복사할 요소 범위의 시작점
n - 복사할 요소의 개수
result - 대상 범위의 시작점

반환값

ranges :: copy_n_result { first + n, result + n } 또는 더 공식적으로는, ranges::in_out_result 타입의 값으로, input_iterator 반복자를 ranges:: next ( first, n ) 와 동일하게 포함하고, weakly_incrementable 반복자를 ranges:: next ( result, n ) 와 동일하게 포함합니다.

복잡도

정확히 n 번의 할당.

참고 사항

실제로, std::ranges::copy_n 구현은 값 타입이 TriviallyCopyable 이고 반복자 타입이 contiguous_iterator 를 만족하는 경우, 다중 할당을 피하고 std::memmove 와 같은 벌크 복사 함수를 사용할 수 있습니다. 또는 이러한 복사 가속화는 컴파일러의 최적화 단계에서 주입될 수 있습니다.

겹치는 범위를 복사할 때, std::ranges::copy_n 는 왼쪽으로 복사할 때(대상 범위의 시작이 소스 범위 밖에 있을 때) 적합한 반면, std::ranges::copy_backward 는 오른쪽으로 복사할 때(대상 범위의 끝이 소스 범위 밖에 있을 때) 적합합니다.

가능한 구현

struct copy_n_fn
{
    template<std::input_iterator I, std::weakly_incrementable O>
    requires std::indirectly_copyable<I, O>
    constexpr ranges::copy_n_result<I, O>
        operator()(I first, std::iter_difference_t<I> n, O result) const
    {
        for (; n-- > 0; (void)++first, (void)++result)
            *result = *first;
        return {std::move(first), std::move(result)};
    }
};
inline constexpr copy_n_fn copy_n{};

예제

#include <algorithm>
#include <iomanip>
#include <iostream>
#include <iterator>
#include <string>
#include <string_view>
int main()
{
    const std::string_view in{"ABCDEFGH"};
    std::string out;
    std::ranges::copy_n(in.begin(), 4, std::back_inserter(out));
    std::cout << std::quoted(out) << '\n';
    out = "abcdefgh";
    const auto res{std::ranges::copy_n(in.begin(), 5, out.begin())};
    const auto i{std::distance(std::begin(in), res.in)};
    const auto j{std::distance(std::begin(out), res.out)};
    std::cout << "in[" << i << "] = '" << in[i] << "'\n"
              << "out[" << j << "] = '" << out[j] << "'\n";
}

출력:

"ABCD"
in[5] = 'F'
out[5] = 'f'

참고 항목

요소 범위를 새로운 위치로 복사합니다
(알고리즘 함수 객체)
요소 범위를 역순으로 복사합니다
(알고리즘 함수 객체)
특정 조건을 만족하는 요소를 생략하고 요소 범위를 복사합니다
(알고리즘 함수 객체)
특정 조건을 만족하는 요소를 다른 값으로 대체하여 범위를 복사합니다
(알고리즘 함수 객체)
역순으로 된 범위의 복사본을 생성합니다
(알고리즘 함수 객체)
요소 범위를 복사하고 회전시킵니다
(알고리즘 함수 객체)
연속된 중복 요소가 없는 일부 범위의 복사본을 생성합니다
(알고리즘 함수 객체)
요소 범위를 새로운 위치로 이동합니다
(알고리즘 함수 객체)
요소 범위를 역순으로 새로운 위치로 이동합니다
(알고리즘 함수 객체)
(C++11)
지정된 개수의 요소를 새로운 위치로 복사합니다
(함수 템플릿)