std::vector<int> nums{ 1,2,3,4 };
std::vector<int> map_example;
std::vector<int> filter_example;
std::transform(nums.begin(), nums.end(), std::back_inserter(map_example), [](const auto& x) {return x * x; });
std::copy_if(nums.begin(), nums.end(), std::back_inserter(filter_example), [](const auto& x) {return x % 2 == 0; });
auto reduce_example = std::accumulate(nums.begin(), nums.end(), 1, [](const auto& x,const auto& y) {return x * y; });
for (auto& i : map_example)
{
cout << i << "\t";
}
cout << endl;
for (auto& i : filter_example)
{
cout << i << "\t";
}
cout << endl;
cout << reduce_example;
cout << endl;
좀 불편하긴한데;; 아무튼 쓸수있다.
map: std::transform // #include <algorithm> 필요
filter: std::copy_if // #include <algorithm> 필요
reduce: std::reduce // #include <numeric> 필요...하다는데 vs2019에서 추가해도 사용이 안되는듯하다.. -> 쓸수있다.. 내가 엄한데서 C++ 버전 설정을 하고있었던거..
reduce: std::accumulate // reduce 와 비슷하다 그러나 reduce는 execution을 정해주어 병렬 처리가 가능
accutmulate의 경우 3번째가 초기값, 4번째가 펑션이고, 4번째를 비워두면 자동으로 + 로 되는듯, 여기서는 곱으로 해서 초기값을 1로 해주었다 (0으로 곱하면 무조건 0이므로..)
모던C++ 에 파이프가 없는건 아니지만 적용하기가 좀 힘들어보여서 변수를 만들어줘야한다.
transform 같은경우는 3번째 인자에 다른 이터레이터를 주어 map2 처럼 사용할수도 있다.
back_inserter 같은경우는 해당 파라미터에 push_back 하는걸 OOP 형식이 아닌 함수형태로 쓰는법이다. 저렇개 해줘야 파라미터로 받은 벡터에 들어간다.
front_inserter 도 당연히 존재하는데 이는 push_front 인터페이스 가 있어야지만 사용가능하므로 벡터에서는 못쓰고 iterator 헤더를 인클루드 해줘야한다. back_inserter 는 VS 기준으로 걍 쓸수있다
그 밖에도 다양한 함수들이 미친듯이 추가되고있다.
추가되는건 좋은데 안그래도 어려운 C++ 공부를 더 어렵게 하고있다ㅜ 그리고 왜 이름을 FP 에서 쓰는 느낌으로 안 만드냐고 ㅜ
'프로그래밍 언어 노트 > C++ | Modern C++' 카테고리의 다른 글
[Modern C++] C++ structured binding (0) | 2019.12.21 |
---|---|
[Modern C++] C++ 의 커링 (0) | 2019.12.18 |
[Modern C++] C++ 코루틴 (0) | 2019.07.09 |
[C++] 숨겨진 This pointer 는 어떻게 넘어 가는가~ 2 (0) | 2019.07.09 |
[C++] 숨겨진 This pointer 는 어떻게 넘어 가는가~ (0) | 2019.07.01 |