Transform Function
transform function 에 대해서
1. 개념
transform 함수는 <algorithm>에 정의되어 있다.
특정 함수를 써서 값을 변경시킬 때 유용하다.
넣을 input A를 함수 f에 통과시켜서 output B를 뽑아내고 싶을 때 편하다.
Array의 경우 각 값을 다 바꾸기 위해선 iterate한 방식으로 loop를 돌려야하는데 이 경우 코드가 난잡해진다. input 형식은 array도 단일 값도 모두 가능하다.
2. 형태
1) 단항 함수형
넣을 함수의 parameter가 하나인 경우
ex) int add(int n) 이면 single parameter 이다.
이때 함수는
1
2
3
template <class InputIt, class OutputIt, class UnaryOperation>
OutputIt transform(InputIt first1, InputIt last1, OutputIt d_first,
UnaryOperation unary_op);
- first1, last1 : transform 함수를 적용할 원소들을 가리키는 범위
- d_first : 결과를 저장할 범위 (first1과 동일해도 된다. 이 경우, 기존 데이터를 덮어쓴다)
- unary_op : 원소들을 변환할 함수
first1부터 last1 전까지 범위의 원소들을 unary_op를 수행하고, 그 결과를 d_first부터 차례로 저장한다
2) 이항 함수형
넣을 함수의 paramter가 두 개인 경우 ex) int cmp(int a, int b) 이면 double parameter 이다.
1
2
3
template <class InputIt1, class InputIt2, class OutputIt, class BinaryOperation>
OutputIt transform(InputIt1 first1, InputIt1 last1, InputIt2 first2,
OutputIt d_first, BinaryOperation binary_op);
단항일때랑 거의 유사한데, InputIt2 first2가 추가되었고 template에서 input1이랑 2랑 나뉜다. parameter도 모두 동일하며
- first2 : transform 함수를 적용할 두 번째 원소들의 시작점
만 추가되었다.
first1부터 last1 전까지 범위의 원소들과 first2부터 동일 갯수의 원소들로 binary_op를 수행하고, 그 결과를 d_first부터 차례로 저장한다
3. 사용 예시
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
int twice(int n) {
return n*2;
} //binary_op
int main(){
std::vector<int> vec = {1, 2, 3, 4, 5};
for(int i = 0; i < vec.size(); i++){
std::cout << vec[i];
} //before transform 출력
std::cout << std::endl;
std::transform(vec.begin(), vec.end(), vec.begin(), twice);
for(int i = 0; i < vec.size(); i++){
std::cout << vec[i];
} //after transform 출력
return 0;
}
// 실행 결과
1, 2, 3, 4, 5
1, 4, 9, 16, 25
4. 사용 case
letter과 같은 string 형태의 배열에서 모두 소문자/대문자로 변경을 해야할 때 transform 함수를 적용하면 편하게 바꿀 수 있다.
출처 : https://artist-developer.tistory.com/28