이번 글에서는 C++ STL 함수를 활용해 테스트 케이스를 생성하는 방법을 살펴보겠습니다. 배열 기반 프로그램의 테스트 케이스를 일일이 손으로 작성하면 매우 번거롭고 비효율적일 수 있습니다. C++은 이런 작업을 간편하게 처리해 주는 두 가지 함수를 제공합니다.
generate() 메서드
C++의 std::algorithm::generate() 함수는 생성자 함수(gen)를 반복 호출하여 반환된 값으로 first부터 last까지 범위의 모든 요소에 값을 할당합니다. 매개변수는 세 가지입니다.
- first: 값을 채우기 시작할 초기 위치를 가리키는 순방향 반복자
- last: 값을 채울 마지막 위치를 가리키는 반복자
- gen: 인자 없이 호출되며 반환값을 생성하는 함수
예제
다음 구현 예제를 통해 더 잘 이해해 보겠습니다.
#include <bits/stdc++.h>
using namespace std;
int create_random() {
return (rand() % 1000);
}
int main () {
srand(time(NULL));
vector<int> data(15);
generate(data.begin(), data.end(), create_random);
for (int i=0; i<data.size(); i++)
cout << data[i] << " " ;
}출력
449 180 785 629 547 912 581 520 534 778 670 302 345 965 107
위 예제에서는 크기가 15인 벡터 전체를 generate()로 채웠습니다. 실행할 때마다 난수 시드가 달라지므로 출력 결과는 매번 다르게 나타납니다.
generate_n() 메서드
C++의 std::algorithm::generate_n() 함수는 생성자 함수(gen)를 n번 호출하여 그 반환값으로 처음 n개 요소에만 값을 할당합니다. 매개변수는 세 가지입니다.
- first: 값을 채우기 시작할 초기 위치를 가리키는 순방향 반복자
- n: 생성자 함수를 호출할 횟수, 즉 채울 요소의 개수
- gen: 인자 없이 호출되며 반환값을 생성하는 함수
예제
다음 구현 예제를 통해 더 잘 이해해 보겠습니다.
#include <bits/stdc++.h>
using namespace std;
int create_random() {
return (rand() % 1000);
}
int main () {
srand(time(NULL));
vector<int> data(15);
generate_n(data.begin(), 6, create_random);
for (int i=0; i<data.size(); i++)
cout << data[i] << " " ;
}출력
540 744 814 771 254 913 0 0 0 0 0 0 0 0 0
위 예제에서는 크기가 15인 벡터 중 앞의 6개 요소만 난수로 채워졌습니다. 나머지 요소는 초기화되지 않은 상태(여기서는 0)로 그대로 유지됩니다. 이처럼 generate()는 컨테이너 전체를, generate_n()은 지정한 개수만큼만 채우고 싶을 때 유용하게 사용할 수 있습니다.