loading
본문 바로가기
Language/C, C++

[C++] transform 함수

by 개발자 김모씨 2020. 11. 3.
반응형

<C++ transform 함수>

 

안녕하세요.
개발자 김모씨입니다.

C, C++ 탭을 새로 만들었습니다~~~~~~
여기에는 실무에서 주로 사용되는 함수들,
또는 코딩테스트에서 사용하면 편리한 함수들을
간단하고 가볍게 공유할 거에요!

저도 레퍼런스 자료로 삼고, 여러분도 공유받고 알아갈 수 있으니,
누이좋고 매부좋고
도랑치고 가재잡고
님도보고 뽕도따고
마당쓸다 돈도줍는
일석이조의 시간~~~이겠죠!!!!!(자기합리화)

그럼 시작해보죠!

 

transform 함수의 원형

transform 함수는 <algorithm>에 정의되어 있습니다!
특정 함수를 써서 값을 변경하거나 할 때 유용한 함수죠.

형태는 크게 두 가지로 나눌 수 있는데요. 단항(unary) 항수형 포맷과 이항(binary) 함수형 포맷입니다.
단항, 이항 하니까 어려우신가요....?
쉽게 표현하자면, transform을 위한 operation 함수의 parameter가 몇개인가 로 구분하는 겁니다.
단일 parameter일 경우에는 단항 함수, 두 개의 parameter일 경우에는 이항 함수인 거죠.

먼저 단항 함수형 transform 부터 보시죠.

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부터 차례로 저장한다"
가 되겠네요.

이항함수형 transform도 비슷합니다.

template <class InputIt1, class InputIt2, class OutputIt, class BinaryOperation>
OutputIt transform(InputIt1 first1, InputIt1 last1, InputIt2 first2,
                   OutputIt d_first, BinaryOperation binary_op);

first1, last1 : transform 함수를 적용할 첫 번째 원소들을 가리키는 범위
first2 : transform 함수를 적용할 두 번째 원소들의 시작점
d_first : 결과를 저장할 범위. (first1, first2와 동일해도 됨. 이 경우, 기존 데이터를 덮어쓰게 됨)
binary_op : 원소들을 변환할 함수. 2 개의 parameter를 가짐.

단항 함수형과 마찬가지로 간단히 표현하자면,
"first1부터 last1 전까지 범위의 원소들과 first2부터 동일 갯수의 원소들로 binary_op를 수행하고, 그 결과를 d_first부터 차례로 저장한다"
가 되겠네요.

 

transform 함수 사용 예시

transform 함수의 활용 범위는 무궁무진 합니다. 알아두면 효자노릇을 똑부러지게 할 녀석이죠.

먼저 간단히 vector부터 볼까요?

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

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

vector 내의 값들을 두 배로 증가시키는 예제인데요.
이처럼, transform 함수는 vector의 각 요소 값을 변경하기 위해 사용할 수 있습니다.

vector의 시작과 끝을 .begin(), .end() 함수로 표현한다는 점 참고하세요!
vector는 iterator를 통해서 위치를 표현하여야 합니다.
iterator 관련해서는 추후에 업로드 예정입니다!!

 

string 변환에도 사용할 수 있습니다.

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

int main() {
    std::string str = "Hello World";
    std::cout << str << std::endl;

    std::transform(str.begin(), str.end(), str.begin(), ::toupper);
    std::cout << str << std::endl;
    
    return 0;
}
//실행 결과

Hello World
HELLO WORLD

 

알파벳 charactor를 소문자에서 대문자로 변환해주는 toupper 함수를 사용한 예제입니다.
예를 들어, 알고리즘 문제에서 "소문자와 대문자를 동일하게 취급한다" 등의 표현이 있을 경우,
꽤나 유용하게 사용할 수 있겠죠?

 

이 외에도, 수많은 자료형들의 요소 값 변경에 transform 함수를 사용할 수 있습니다.

 

 

자 오늘은 이렇게 C++의 transform 함수에 관해 알아보았습니다.

위의 예제들을 transform 함수를 사용하지 않으면 어떻게 구현할 수 있나요?
for문 또는 while문의 반복문을 통해 각 요소들의 값을 하나하나 연산해주어야겠죠?

코드를 아름답게 해주는 transform 함수! (코드의 심미성도 중요합니다!!!!)
기억해두었다가 유용하게 써먹자구요!

그럼 오늘은 여기까지!

좋아요와 구독하기는 개발자 김모씨에게 큰 힘이 됩니당당당

 

감사합니당당당

 

 

반응형

'Language > C, C++' 카테고리의 다른 글

[C++] STL List 사용법  (0) 2022.05.03
[C++] STL Vector 사용법  (2) 2020.11.16
[C++] 영어 알파벳 대문자 소문자 변환 총정리  (1) 2020.11.05

댓글