C++ transform() 함수란?
transform() 함수는 C++ STL(표준 템플릿 라이브러리)에 포함된 알고리즘 함수로, 배열이나 컨테이너의 모든 요소에 특정 연산을 일괄 적용할 때 사용됩니다. 이 함수를 사용하려면 <algorithm> 헤더 파일을 반드시 포함해야 합니다.
예를 들어 배열의 각 요소를 제곱한 값을 다른 배열에 저장하고 싶다면, 반복문을 직접 작성하는 대신 transform() 함수 하나로 간결하게 처리할 수 있습니다.
transform() 함수의 두 가지 동작 모드
transform() 함수는 크게 두 가지 모드로 동작합니다.
- 단항(Unary) 연산 모드 : 하나의 시퀀스 요소에 연산을 적용
- 이항(Binary) 연산 모드 : 두 개의 시퀀스 요소를 결합하는 연산을 적용
1. 단항 연산 모드 (Unary Operation Mode)
단항 연산 모드에서는 하나의 연산자(또는 함수)만 받아 입력 요소를 변환한 뒤 출력 시퀀스에 저장합니다. 호출 형식은 다음과 같습니다.
transform(시작_반복자, 끝_반복자, 결과_반복자, 단항_연산_함수);
예제 코드
아래 예제는 1부터 10까지의 숫자가 담긴 배열의 각 요소를 제곱하여 결과 배열에 저장합니다.
#include <iostream>
#include <algorithm>
using namespace std;
int square(int x) {
// 제곱 함수 정의
return x * x;
}
int main(int argc, char **argv) {
int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int res[10];
// arr의 모든 요소에 square 함수 적용 후 res에 저장
transform(arr, arr + 10, res, square);
for(int i = 0; i < 10; i++) {
cout << res[i] << "\n";
}
}
실행 결과
1 4 9 16 25 36 49 64 81 100
2. 이항 연산 모드 (Binary Operation Mode)
이항 연산 모드에서는 두 개의 데이터 시퀀스에 대해 동시에 연산을 수행할 수 있습니다. 예를 들어 서로 다른 두 배열의 같은 위치에 있는 요소들을 더하거나 곱하려면 이항 연산 모드를 사용해야 합니다. 호출 형식은 다음과 같습니다.
transform(첫번째_시작_반복자, 첫번째_끝_반복자, 두번째_시작_반복자, 결과_반복자, 이항_연산_함수);
예제 코드
아래 예제는 두 배열의 대응하는 요소들을 서로 곱한 결과를 새로운 배열에 저장합니다.
#include <iostream>
#include <algorithm>
using namespace std;
int multiply(int x, int y) {
// 곱셈 함수 정의
return x * y;
}
int main(int argc, char **argv) {
int arr1[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int arr2[10] = {54, 21, 32, 65, 58, 74, 21, 84, 20, 35};
int res[10];
// arr1과 arr2의 대응 요소를 곱하여 res에 저장
transform(arr1, arr1 + 10, arr2, res, multiply);
for(int i = 0; i < 10; i++) {
cout << res[i] << "\n";
}
}
실행 결과
54 42 96 260 290 444 147 672 180 350
마무리 정리
transform() 함수는 반복문 없이도 배열이나 벡터 등의 모든 요소에 원하는 연산을 손쉽게 적용할 수 있는 강력한 STL 알고리즘입니다. 단일 시퀀스를 변환할 때는 단항 연산 모드, 두 시퀀스를 결합할 때는 이항 연산 모드를 사용하면 됩니다. 또한 C++11부터 지원되는 람다 함수(lambda)와 함께 사용하면 별도의 함수 정의 없이도 더욱 간결하게 코드를 작성할 수 있으니 참고하시기 바랍니다.