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
'프로그래밍 > 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 |