Namespaces
Variants

std::generate_n

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

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


 
헤더에 정의됨 <algorithm>
template< class OutputIt, class Size, class Generator >
OutputIt generate_n( OutputIt first, Size count, Generator g );
(1) (C++20부터 constexpr)
template< class ExecutionPolicy,
          class ForwardIt, class Size, class Generator >
ForwardIt generate_n( ExecutionPolicy&& policy,
                      ForwardIt first, Size count, Generator g );
(2) (C++17부터)
1) 주어진 함수 객체에 의해 생성된 값을 g, 처음 count개의 요소에, 범위 시작 위치는 first, 단 count > 0. 그렇지 않으면 아무것도 하지 않습니다.
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부터)

만약 Size가 변환 가능하지않으면 정수형, 프로그램의 형식이 잘못되었습니다.

매개변수

first - 생성할 요소 범위의 시작
count - 생성할 요소의 개수
policy - 사용할 실행 정책
g - 호출될 생성기 함수 객체.

함수의 시그니처는 다음과 같아야 합니다:

Ret fun();

타입 Ret는 OutputIt 타입의 객체가 역참조되고 Ret 타입의 값을 할당할 수 있어야 합니다. ​

타입 요구 사항
-
OutputIt는 LegacyOutputIterator의 요구 사항을 충족해야 합니다.
-
ForwardIt는 LegacyForwardIterator의 요구 사항을 충족해야 합니다.

반환값

할당된 마지막 요소의 다음 반복자, 단 count > 0, first.

복잡도

정확히 std::max(0, count)번의 g() 호출 및 대입.

예외

템플릿 매개변수 ExecutionPolicy가 있는 오버로드는 다음과 같이 오류를 보고합니다:

  • 알고리즘의 일부로 호출된 함수의 실행이 예외를 던지고 ExecutionPolicy가 표준 정책 중 하나인 경우 std::terminate가 호출됩니다. 다른 ExecutionPolicy의 경우 동작은 구현 정의입니다.
  • 알고리즘이 메모리 할당에 실패하면 std::bad_alloc이 발생합니다.

가능한 구현

template<class OutputIt, class Size, class Generator>
constexpr // since C++20
OutputIt generate_n(OutputIt first, Size count, Generator g)
{
    for (Size i = 0; i < count; ++i, ++first)
        *first = g();
    
    return first;
}

예제

#include <algorithm>
#include <functional>
#include <iostream>
#include <iterator>
#include <random>

int main()
{
    std::mt19937 rng; // default constructed, seeded with fixed seed
    std::generate_n(std::ostream_iterator<std::mt19937::result_type>(std::cout, " "),
                    5, std::ref(rng));
    std::cout << '\n';
}

출력:

3499211612 581869302 3890346734 3586334585 545404204

결함 보고서

다음 동작 변경 결함 보고서는 이전에 발행된 C++ 표준에 소급 적용되었습니다.

DR 적용 대상 발행 시 동작 올바른 동작
LWG 426 C++98 복잡도 요구 사항이 '정확히 count번의 호출
또는 대입'이었는데, count가 음수이면 잘못됨
호출 또는 대입 없음
단 count가 양수가 아닌 경우
LWG 865 C++98 생성 범위 다음의 첫 번째 요소의 위치
가 반환되지 않음
반환됨

같이 보기

범위의 N개 요소에 주어진 값을 복사 대입
(함수 템플릿 & 알고리즘 함수 객체)
연속적인 함수 호출의 결과를 범위의 모든 요소에 할당
(함수 템플릿 & 알고리즘 함수 객체)
함수를 N번 적용한 결과를 저장
(알고리즘 함수 객체)