Namespaces
Variants

std::ranges::generate_n

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

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


 
제약 알고리즘
이 메뉴의 모든 이름은 std::ranges
비수정 시퀀스 연산
수정 시퀀스 연산
분할 연산
정렬 연산
이진 탐색 연산 (정렬된 범위에 대해)
       
       
집합 연산 (정렬된 범위에 대해)
힙 연산
최소/최대 연산
       
       
순열 연산
폴드 연산
수치 연산
(C++23)            
초기화되지 않은 저장소에 대한 연산
반환 타입
 
헤더 <algorithm>
호출 시그니처
template< std::input_or_output_iterator O, std::copy_constructible F >
requires std::invocable<F&> && std::indirectly_writable<O, std::invoke_result_t<F&>>
constexpr O
    generate_n( O first, std::iter_difference_t<O> n, F gen );
(C++20부터)

함수 객체 를 연속적으로gen 호출한 결과를 범위 [first, first + n)의 각 요소에 할당합니다. 0 < n인 경우에는 아무것도 하지 않습니다.

이 페이지에 설명된 함수형 개체는 알고리즘 함수 개체 (비공식적으로 niebloids라고 함)이며, 즉 다음과 같습니다:

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

매개변수

first - 수정할 요소 범위의 시작
n - 수정할 요소의 개수
gen - 생성기 함수 객체

반환값

할당된 마지막 요소의 다음 위치를 가리키는 반복자. 0 < count 인 경우, first 그렇지 않으면.

복잡도

정확히 n 번의 gen ( ) 호출 및 할당이 수행됩니다.

가능한 구현

struct generate_n_fn
{
    template<std::input_or_output_iterator O, std::copy_constructible F>
    requires std::invocable<F&> && std::indirectly_writable<O, std::invoke_result_t<F&>>
    constexpr O operator()(O first, std::iter_difference_t<O> n, F gen) const
    {
        for (; n-- > 0; *first = std::invoke(gen), ++first)
        {}
        return first;
    }
};
inline constexpr generate_n_fn generate_n {};

예제

#include <algorithm>
#include <array>
#include <iostream>
#include <random>
#include <string_view>
auto dice()
{
    static std::uniform_int_distribution<int> distr {1, 6};
    static std::random_device engine;
    static std::mt19937 noise {engine()};
    return distr(noise);
}
void print(const auto& v, std::string_view comment)
{
    for (int i : v)
        std::cout << i << ' ';
    std::cout << '(' << comment << ")\n";
}
int main()
{
    std::array<int, 8> v;
    std::ranges::generate_n(v.begin(), v.size(), dice);
    print(v, "dice");
    std::ranges::generate_n(v.begin(), v.size(), [n {0}] mutable { return n++; });
    // same effect as std::iota(v.begin(), v.end(), 0);
    print(v, "iota");
}

가능한 출력:

5 5 2 2 6 6 3 5 (dice)
0 1 2 3 4 5 6 7 (iota)

참고 항목

함수의 결과를 범위에 저장
(알고리즘 함수 객체)
균일 난수 비트 생성기로부터 난수로 범위를 채움
(알고리즘 함수 객체)
범위의 요소들에 특정 값을 할당
(알고리즘 함수 객체)
여러 요소에 값을 할당
(알고리즘 함수 객체)
요소 범위에 함수를 적용
(알고리즘 함수 객체)
연속적인 함수 호출 결과를 범위 내 N개 요소에 할당
(함수 템플릿)