💡 퀵 접속: cpp.kr/generate_n

generate_n

C++ 표준 라이브러리의 알고리즘으로, 주어진 위치부터 시작하여 지정된 개수만큼의 요소를 함수를 통해 생성된 값으로 채웁니다. generate_n은 원본 범위를 직접 수정하며, 지정된 개수만큼의 연속된 요소에 대해 함수를 호출하여 새로운 값을 생성합니다.

기본 사용법

#include <iostream>
#include <vector>
#include <algorithm>
#include <random>

int main() {
    std::vector<int> numbers(5);
    
    std::cout << "초기 벡터: ";
    for (int n : numbers) std::cout << n << " ";
    std::cout << std::endl;
    
    // 난수 생성기 설정
    std::random_device rd;
    std::mt19937 gen(rd());
    std::uniform_int_distribution<> dis(1, 100);
    
    // 처음 3개의 요소를 난수로 채움
    std::generate_n(numbers.begin(), 3,
                   [&]() { return dis(gen); });
    
    std::cout << "처음 3개를 난수로 채운 후: ";
    for (int n : numbers) std::cout << n << " ";
    std::cout << std::endl;
    
    return 0;
}

실행 결과:

초기 벡터: 0 0 0 0 0
처음 3개를 난수로 채운 후: 42 17 89 0 0

문자열에서 사용

#include <iostream>
#include <string>
#include <algorithm>
#include <random>

int main() {
    std::string text(10, ' ');
    
    std::cout << "초기 문자열: [" << text << "]" << std::endl;
    
    // 난수 생성기 설정
    std::random_device rd;
    std::mt19937 gen(rd());
    std::uniform_int_distribution<> dis('A', 'Z');
    
    // 처음 5개의 문자를 대문자 난수로 채움
    std::generate_n(text.begin(), 5,
                   [&]() { return static_cast<char>(dis(gen)); });
    
    std::cout << "처음 5개를 대문자 난수로 채운 후: [" << text << "]" << std::endl;
    
    return 0;
}

실행 결과:

초기 문자열: [          ]
처음 5개를 대문자 난수로 채운 후: [XKQMP     ]

사용자 정의 타입에서 사용

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <random>

class Person {
    std::string name;
    int age;
public:
    Person(const std::string& n, int a) : name(n), age(a) {}
    
    void print() const {
        std::cout << name << " (" << age << "세)" << std::endl;
    }
};

int main() {
    std::vector<Person> people(5, Person("", 0));
    
    std::cout << "초기 목록:" << std::endl;
    for (const auto& person : people) {
        person.print();
    }
    
    // 난수 생성기 설정
    std::random_device rd;
    std::mt19937 gen(rd());
    std::uniform_int_distribution<> age_dis(20, 50);
    
    // 이름 목록
    std::vector<std::string> names = {"Alice", "Bob", "Charlie", "David", "Eve"};
    std::uniform_int_distribution<> name_dis(0, names.size() - 1);
    
    // 처음 3개의 Person 객체를 랜덤한 이름과 나이로 채움
    std::generate_n(people.begin(), 3,
                   [&]() {
                       return Person(names[name_dis(gen)], age_dis(gen));
                   });
    
    std::cout << "\n처음 3개를 랜덤한 Person 객체로 채운 후:" << std::endl;
    for (const auto& person : people) {
        person.print();
    }
    
    return 0;
}

실행 결과:

초기 목록:
 (0세)
 (0세)
 (0세)
 (0세)
 (0세)

처음 3개를 랜덤한 Person 객체로 채운 후:
Bob (35세)
Eve (42세)
Charlie (28세)
 (0세)
 (0세)

참고사항

  • generate_n은 algorithm 헤더에 정의되어 있습니다.
  • 원본 범위를 직접 수정합니다.
  • 시간 복잡도는 O(n)입니다.
  • 지정된 개수만큼의 연속된 요소에 대해 함수를 호출하여 새로운 값을 생성합니다.
  • 요소의 순서는 유지됩니다.
  • 예외 안전성을 보장합니다.
  • generate는 범위의 모든 요소를 생성하는 버전입니다.
  • fill_n은 지정된 개수만큼 요소를 동일한 값으로 채우는 버전입니다.
함수 설명
generate_n(first, count, gen) first부터 시작하여 count개의 요소를 gen 함수를 호출하여 생성된 값으로 채움