42-2-마.요소 변경

transform 함수는 반복자 구간에 대해 함수 객체를 적용한 후 그 결과를 다른 구간에 복사한다. 단항 함수를 취하는 버전과 이항 함수를 취하는 버전 두 가지가 있다.

 

OutIt transform(InIt first, InIt last, OutIt result, UniOp op);

OutIt transform(InIt1 first1, InIt1 last1, InIt2 first2, OutIt result, BinOp op);

 

단항 함수를 취하는 버전은 반복자 구간의 각 요소를 이 함수로 넘겨 리턴된 값을 result 반복자 위치에 대입한다. 이항 함수를 취하는 버전은 두 반복자 구간의 대응되는 값을 함수로 넘겨 리턴되는 값을 result 반복자 위치에 대입한다. 한 구간에 대한 단순 변환을 할 것인지 아니면 두 구간을 합쳐서 변환을 할 것인지를 선택할 수 있다. 이 함수는 처리한 결과를 항상 result로 출력하므로 원본이 그대로 유지된다. 물론 result가 원본이 될 수도 있다.

 

: transform

#include <iostream>

#include <vector>

#include <algorithm>

using namespace std;

 

template<typename C> void dump(const char *desc, C c) { cout.width(12);cout << left << desc << "==> ";

      copy(c.begin(),c.end(),ostream_iterator<typename C::value_type>(cout," ")); cout << endl; }

 

int multi2(int a)

{

     return a*2;

}

 

int add(int a, int b)

{

     return a+b;

}

 

void main()

{

     vector<int> src(5), dest(5), sum;

     int i;

 

     for (i=0;i<5;i++) src[i]=i;

     transform(src.begin(),src.end(),dest.begin(),multi2);

     dump("src",src);

     dump("dest",dest);

     transform(src.begin(),src.end(),dest.begin(),back_inserter(sum),add);

     dump("sum",sum);

}

 

src 벡터에 0 ~ 4까지의 정수를 저장한 상태에서 전체 구간에 대해 단항 multi2 함수 객체를 적용했다. multi2 함수 객체는 0, 1, 2 각각을 받아 0, 2, 4를 만들어 리턴하며 transform은 그 결과를 dest의 반복자에 대입한다. dest에는 src의 2배되는 값들이 저장될 것이다.

다음으로 이항 객체를 취하는 transform 함수를 호출하여 src와 dest의 대응되는 요소를 add 함수 객체로 넘겼다. 이 함수는 인수로 전달받은 두 값을 더하여 리턴하며 그 결과는 sum 벡터에 삽입된다. 삽입 반복자를 사용했으므로 add가 리턴한 값이 sum 벡터에 삽입될 것이다.

 

src         ==> 0 1 2 3 4

dest         ==> 0 2 4 6 8

sum         ==> 0 3 6 9 12

 

transform 함수로 벡터끼리 연산했는데 첫 번째 호출은 dest=src*2라고 할 수 있고 두 번째 호출은 sum=src+dest라고 할 수 있다. 물론 임의의 컨테이너끼리 조합하여 변환을 할 수도 있다.