numeric

numeric

2023년 6월 16일
library

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를 하나씩 증가시켜서 저장한다.
comments powered by Disqus