💡 퀵 접속: cpp.kr/transform

transform

C++ 표준 라이브러리의 알고리즘으로, 주어진 범위의 각 요소에 대해 변환을 수행하고 그 결과를 다른 범위에 저장합니다. transform은 원본 범위를 수정하지 않으며, 변환된 결과를 새로운 범위에 저장합니다. 단항 변환과 이항 변환 두 가지 버전이 있습니다.

단항 변환 사용법

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

int main() {
    std::vector<int> v = {1, 2, 3, 4, 5};
    std::vector<int> result;
    
    std::cout << "원본 벡터: ";
    for (int x : v) std::cout << x << " ";
    std::cout << std::endl;
    
    // 각 요소를 제곱하여 result에 저장
    std::transform(v.begin(), v.end(), std::back_inserter(result),
                  [](int x) { return x * x; });
    
    std::cout << "변환 후: ";
    for (int x : result) std::cout << x << " ";
    std::cout << std::endl;
    
    return 0;
}

실행 결과:

원본 벡터: 1 2 3 4 5
변환 후: 1 4 9 16 25

이항 변환 사용법

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

int main() {
    std::vector<int> v1 = {1, 2, 3, 4, 5};
    std::vector<int> v2 = {10, 20, 30, 40, 50};
    std::vector<int> result;
    
    std::cout << "v1: ";
    for (int x : v1) std::cout << x << " ";
    std::cout << "\nv2: ";
    for (int x : v2) std::cout << x << " ";
    std::cout << std::endl;
    
    // 두 벡터의 대응하는 요소들을 더하여 result에 저장
    std::transform(v1.begin(), v1.end(), v2.begin(), std::back_inserter(result),
                  [](int a, int b) { return a + b; });
    
    std::cout << "변환 후: ";
    for (int x : result) std::cout << x << " ";
    std::cout << std::endl;
    
    return 0;
}

실행 결과:

v1: 1 2 3 4 5
v2: 10 20 30 40 50
변환 후: 11 22 33 44 55

문자열 변환

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

int main() {
    std::string s = "Hello";
    std::string result;
    
    std::cout << "원본 문자열: " << s << std::endl;
    
    // 모든 문자를 대문자로 변환
    std::transform(s.begin(), s.end(), std::back_inserter(result),
                  [](char c) { return std::toupper(c); });
    
    std::cout << "변환 후: " << result << std::endl;
    
    return 0;
}

실행 결과:

원본 문자열: Hello
변환 후: HELLO

사용자 정의 타입 변환

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

struct Person {
    std::string name;
    int age;
};

struct PersonInfo {
    std::string info;
};

int main() {
    std::vector<Person> people = {
        {"Alice", 20},
        {"Bob", 25},
        {"Charlie", 30},
        {"David", 35},
        {"Eve", 40}
    };
    
    std::vector<PersonInfo> info(people.size());
    
    // Person 객체를 PersonInfo로 변환
    std::transform(people.begin(), people.end(), info.begin(),
        [](const Person& p) {
            return PersonInfo{p.name + " (" + std::to_string(p.age) + "세)"};
        });
    
    // 변환된 정보 출력
    for (const auto& i : info) {
        std::cout << i.info << std::endl;
    }
    
    return 0;
}

실행 결과:

Alice (20세)
Bob (25세)
Charlie (30세)
David (35세)
Eve (40세)

참고사항

  • transform은 algorithm 헤더에 정의되어 있습니다.
  • 원본 범위를 수정하지 않습니다.
  • 시간 복잡도는 O(n)입니다.
  • 단항 변환과 이항 변환 두 가지 버전이 있습니다.
  • 변환 함수는 부작용이 없어야 합니다.
  • 결과를 저장할 범위는 충분한 크기여야 합니다.
  • std::back_inserter를 사용하여 결과를 동적으로 저장할 수 있습니다.
  • 람다 함수나 함수 객체를 변환 함수로 사용할 수 있습니다.
  • 사용자 정의 타입에 대해서도 사용할 수 있습니다.
  • 예외 안전성을 보장합니다.
함수 설명
transform(first, last, result, op) [first, last) 범위의 각 요소에 대해 단항 연산 op를 적용하여 결과를 result에 저장
transform(first1, last1, first2, result, op) [first1, last1) 범위와 [first2, first2 + (last1 - first1)) 범위의 대응하는 요소들에 대해 이항 연산 op를 적용하여 결과를 result에 저장