<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 |
댓글