accumulate
#
1template<class InputIt, class T, class BinaryOperation>
2constexpr // since C++20
3T accumulate(InputIt first, InputIt last, T init, BinaryOperation op)
4{
5 for (; first != last; ++first)
6 init = op(std::move(init), *first); // std::move since C++11
7 return init;
8}
특징
#
- 각 원소 대상으로 뭔가를 적용해서 누적한 결과를 하나(op의 리턴타입)로 리턴하는 함수이다.
- init과 리턴값은 타입이 같다. (0.f, 0L 등으로 타입도 지정가능)
- op가 전달되지 않으면 덧셈 함수가 전달된다.
- BinaryOperator 는 첫번째 인자에 init이 전달돼서 각 원소를 처리한 데이터가 쌓인다.
1std::string dash_fold = [](std::string a, int b)
2{
3 return std::move(a) + '-' + std::to_string(b);
4};
5
6// ret: 1-2-3-4-5-6-7-8-9-10
adjacent_difference
#
1template<class InputIt, class OutputIt, class BinaryOperation>
2constexpr // since C++20
3OutputIt adjacent_difference(InputIt first, InputIt last,
4 OutputIt d_first, BinaryOperation op)
5{
6 if (first == last)
7 return d_first;
8
9 typedef typename std::iterator_traits<InputIt>::value_type value_t;
10 value_t acc = *first; // 첫번째 값
11 *d_first = acc; // output의 첫배열에 저장
12
13 while (++first != last)
14 {
15 value_t val = *first;
16 *++d_first = op(val, std::move(acc)); // std::move since C++11
17 acc = std::move(val);
18 }
19
20 return ++d_first;
21}
특징
#
- 인접한 두 요소에 뭔가를 적용한 값을 배열형태(꼭 배열이여야 하는건 아님)로 리턴하는 함수이다.
- 리턴되는 배열의 첫 원소는 input 배열의 첫번째 데이터이다.
- op에 전달되는 인자는 배열의 순서상 (n+1, n) 인덱스의 데이터로 전달된다.
- op가 전달되지 않으면 두 수의 차이(a-b)가 리턴되는 함수가 적용된다.
1int print_value = [](int a, int b) {
2 std::cout << a << " / " << b << std::endl;
3 return a;
4}
5
6/*
72 / 1
83 / 2
96 / 3
105 / 6
11ret_arr: 1 2 3 6 5
12*/
iota
#
1template<class ForwardIt, class T>
2constexpr // since C++20
3void iota(ForwardIt first, ForwardIt last, T value)
4{
5 while (first != last)
6 {
7 *first++ = value;
8 ++value;
9 }
10}
특징
#
- first부터 last까지 value를 하나씩 증가시켜서 저장한다.