본문 바로가기
프로그래밍/C++

C++ transform

by comflex 2023. 2. 18.
728x90
반응형

C++의 transform 함수는 STL (Standard Template Library)의 알고리즘 중 하나로, 컨테이너의 각 요소에 대해 특정한 연산을 수행하고 그 결과를 다른 컨테이너에 저장하는 함수입니다. 다음은 transform 함수의 일반적인 형태입니다.

 

template<class InputIt, class OutputIt, class UnaryOperation>
OutputIt transform(InputIt first1, InputIt last1, OutputIt d_first, UnaryOperation unary_op);
  • first1, last1: 입력 컨테이너의 시작과 끝을 가리키는 반복자입니다.
  • d_first: 결과를 저장할 출력 컨테이너의 시작 위치를 가리키는 반복자입니다.
  • unary_op: 컨테이너의 각 요소에 적용할 연산을 정의하는 함수 객체입니다.

예를 들어, 다음과 같이 벡터의 각 요소를 제곱하여 새로운 벡터에 저장할 수 있습니다.

 

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

int main() {
    std::vector<int> vec1{1, 2, 3, 4, 5};
    std::vector<int> vec2(vec1.size());

    std::transform(vec1.begin(), vec1.end(), vec2.begin(), [](int x) { return x * x; });

    for (auto& x : vec2) {
        std::cout << x << " ";
    }
    std::cout << std::endl;

    return 0;
}

위 코드에서 transform 함수는 vec1의 각 요소를 제곱하여 vec2에 저장합니다. 이때 [](int x) { return x * x; } 함수 객체는 각 요소를 제곱하는 연산을 수행합니다.

또한, 다음과 같이 두 개의 벡터의 요소를 더하여 새로운 벡터에 저장할 수도 있습니다.

반응형
#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> vec1{1, 2, 3, 4, 5};
    std::vector<int> vec2{5, 4, 3, 2, 1};
    std::vector<int> vec3(vec1.size());

    std::transform(vec1.begin(), vec1.end(), vec2.begin(), vec3.begin(), [](int x, int y) { return x + y; });

    for (auto& x : vec3) {
        std::cout << x << " ";
    }
    std::cout << std::endl;

    return 0;
}

위 코드에서 transform 함수는 vec1과 vec2의 각 요소를 더하여 vec3에 저장합니다. 이때 [](int x, int y) { return x + y; } 함수 객체는 두 요소를 더하는 연산을 수행합니다.

이처럼 transform 함수는 간단한 연산을 통해 컨테이너의 요소들을 변환할 수 있으며, 많은 유용한 알고리즘을 작성하는 데에 활용됩니다.

또한, transform 함수는 다른 STL 알고리즘과 함께 사용할 수 있습니다. 예를 들어, 다음과 같이 transform 함수와 accumulate 함수를 함께 사용하여 벡터의 평균값을 구할 수 있습니다.

 

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

int main() {
    std::vector<int> vec{1, 2, 3, 4, 5};
    double avg = std::accumulate(vec.begin(), vec.end(), 0.0) / vec.size();

    std::vector<double> vec2(vec.size());
    std::transform(vec.begin(), vec.end(), vec2.begin(), [avg](int x) { return x - avg; });

    for (auto& x : vec2) {
        std::cout << x << " ";
    }
    std::cout << std::endl;

    return 0;
}

위 코드에서 accumulate 함수는 vec의 모든 요소의 합을 구합니다. 이후 평균값을 계산하여 avg에 저장합니다. 그리고 transform 함수는 vec의 각 요소에서 avg를 뺀 값을 vec2에 저장합니다. 이때 [avg](int x) { return x - avg; } 함수 객체는 각 요소에서 avg를 뺀 연산을 수행합니다.

이처럼 transform 함수는 다른 STL 알고리즘과 결합하여 다양한 작업을 수행할 수 있으며, 코드를 간결하고 가독성 있게 작성할 수 있도록 도와줍니다.

마지막으로, transform 함수는 C++11부터 R-value reference를 지원하며, 이를 활용하여 메모리 할당과 복사를 최소화할 수 있습니다. 예를 들어, 다음과 같이 벡터의 요소를 2배로 만들어 새로운 벡터를 생성할 수 있습니다.

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

int main() {
    std::vector<int> vec1{1, 2, 3, 4, 5};
    std::vector<int> vec2(vec1.size());

    std::transform(std::make_move_iterator(vec1.begin()), std::make_move_iterator(vec1.end()), vec2.begin(), [](int x) { return x * 2; });

    for (auto& x : vec2) {
        std::cout << x << " ";
    }
    std::cout << std::endl;

    return 0;
}

위 코드에서 make_move_iterator 함수는 벡터의 요소들을 R-value reference로 변환하여 transform 함수가 임시 벡터를 생성하는 것을 방지합니다. 이를 통해 메모리 할당과 복사를 최소화할 수 있으며, 프로그램의 성능을 향상시킬 수 있습니다.

 

2023.02.17 - [프로그래밍/C++] - C++ Functor(함수 객체)

 

C++ Functor(함수 객체)

C++에서 Functor(함수 객체)는 일반적인 함수 포인터와 달리 객체를 사용하여 함수를 나타냅니다. Functor를 사용하면 C++의 객체 지향 기능과 제네릭 프로그래밍 기능을 모두 활용할 수 있습니다. 이

com-flex.tistory.com

2023.02.21 - [프로그래밍/C++] - C++ 쓰레드(thread)

 

C++ 쓰레드(thread)

C++11부터는 멀티스레드 프로그래밍을 지원하는 thread 라이브러리를 제공합니다. 이 라이브러리를 사용하여 여러 개의 스레드를 생성하고 동시에 실행할 수 있습니다. 스레드 생성 C++의 thread 라

com-flex.tistory.com

2023.02.17 - [프로그래밍/C++] - C++ Functor(함수 객체)

 

C++ Functor(함수 객체)

C++에서 Functor(함수 객체)는 일반적인 함수 포인터와 달리 객체를 사용하여 함수를 나타냅니다. Functor를 사용하면 C++의 객체 지향 기능과 제네릭 프로그래밍 기능을 모두 활용할 수 있습니다. 이

com-flex.tistory.com

 

728x90
반응형

'프로그래밍 > C++' 카테고리의 다른 글

C++ std::remove_if  (0) 2023.03.02
C++ 쓰레드(thread)  (2) 2023.02.21
C++ Functor(함수 객체)  (2) 2023.02.17
C++ std::sort  (2) 2023.01.04
C++ enum 열거형  (1) 2023.01.04