-
[34] - Transform, For_eachGraphics 2021. 8. 9. 16:16
이전에 했던 내용이긴 합니다. 그런데 Transform이라는 함수가 추가었습니다. 논리적으로는 두 함수는 같은 기능을 합니다. 어떤 Container의 원소들에 대해서 어떤 함수, predicate를 적용하는 것입니다. 그런데 설명을 읽어보면 미묘하게 다르다는 사실을 깨닫게 됩니다.
Transform을 유심히 살펴보도록 합니다.
(1)번의 정의를 보면 느낌이 옵니다. 어떤 Container의 범위에 대해서 Unary Operation을 수행하고 그 결과값을 다른 공간에 저장하는 역할을 수행합니다. 참고로 unary operation이란 operand(예를 들어서 +,-,%,/ 등등)가 하나만 있는 수식을 의미합니다. Unary operation -> (https://www.geeksforgeeks.org/unary-operators-cc/) 역시 직접 쳐보면서 이해하는 편이 빠릅니다.
이러면 모든 std::string a의 문자가 uppercase가 되어서 c에 저장, 출력이 될 것입니다. 이 함수의 좋은 점은 Input Conatainer와 output container가 완전히 같아도 된다는 점입니다. container a의 첫 번째 문자를 대체하고 다음 문자를 검증하기 때문입니다. 즉, 위의 코드의 예제에서 다음과 같이 해도 결과는 같습니다.
결과는 완전히 같습니다. 사실 Transform의 진가는 다음의 Overload function에서 드러납니다.
유심히 읽어보면 세 개의 Input Iterator, 한 개의 Output Iterator, Unary가 아닌 Binary Operation을 요구합니다. 세 개의 input Iterator를 요구하는 이유는 한 Container에서 Range를 알게 되면 다른 Container도 크기가 같을 것으로 유추하기 때문입니다. Unary가 하나의 Operand를 요구했던 것처럼 Binary Operation은 우리가 흔히 생각하는 이진탐색이라든가 그런 것이 아니고 두 개의 Operand를 사용한 함수식 또는 방정식을 의미합니다. 그래서 두 개의 Container의 원소들을 취해 함수를 적용하고 싶을 때 이 기능을 사용합니다. 물론 For_each라든가 다른 방식으로 얼마든지 구현을 할 수 있지만 깔끔한 코드 작성을 따라올 수는 없을 것입니다. 다음과 같은 예제를 통해 이해합니다.
그런데 vector a의 크기가 b보다 더 크면 어떻게 될까요? 오류가 생길 것이라 예상했는데 그런 건 아니었습니다.
2041이라는 값을 받았습니다 'Graphics' 카테고리의 다른 글
[36] - find, search, reverse iterators (0) 2021.08.10 [35] - count, all, none_of (0) 2021.08.09 [33] - Remove_if (0) 2021.08.09 [32] - Copy and Filter (0) 2021.08.09 [31] - (C++) For each, Move Semantics, Lambdas, Uniform Initialization - 3 (0) 2021.08.05