adjacent_difference

adjacent_difference (인접 원소의 차이 계산하기)

시퀀스의 각 원소를 바로 앞 원소와의 차이로 바꿔서 새 범위에 저장하는 알고리즘이에요. 순서가 중요한 연산이라 입력부터 출력까지 원소 순서를 그대로 유지하면서 계산해요. <numeric> 헤더에 정의되어 있어요.

출처: cppreference

본문

adjacent_difference는 범위 [first, last)를 읽으면서, 각 원소 xᵢ에 대해 xᵢ - xᵢ₋₁(기본 연산)을 계산해 d_first부터 차례대로 써 내려가요. 첫 번째 원소는 그대로 복사되고, 그 뒤부터는 이전 원소와의 차이가 저장돼요.

기본 시그니처는 이렇게 생겼어요.

template< class InputIt, class OutputIt >
OutputIt adjacent_difference( InputIt first, InputIt last,
                              OutputIt d_first );

병렬 실행 버전과 사용자 정의 이진 연산(op)을 쓰는 오버로드도 있어요.

template< class ExecutionPolicy,
          class ForwardIt1, class ForwardIt2 >
ForwardIt2 adjacent_difference( ExecutionPolicy&& policy,
                                ForwardIt1 first, ForwardIt1 last,
                                ForwardIt2 d_first );

template< class InputIt, class OutputIt, class BinaryOp >
OutputIt adjacent_difference( InputIt first, InputIt last,
                              OutputIt d_first, BinaryOp op );

동작 방식은 이렇죠.

  • Tdecltype(first)의 값 타입이에요.
    1. [first, last)가 비어 있으면 아무 일도 하지 않아요.
  • 그 외에는 다음 동작을 순서대로 수행해요.
    • 타입 T의 누산기 acc를 만들고 *first로 초기화해요.
    • acc*d_first에 대입해요.
    • [++first, last) 안의 각 반복자 iter에 대해 계산을 이어가요.
  • op 버전(3,4)은 빼기 대신 op(*prev, *iter)로 계산해요.

반환 값은 d_first + (last - first)로, 출력 범위의 끝을 가리키는 반복자예요. 상수(C++20 이후)로 지정했기 때문에 constexpr 문맥에서도 쓸 수 있어요.

주의할 점은 동일한 범위를 입력과 출력으로 쓰면(inplace) 미정의 동작이 될 수 있다는 거예요. 원소 순서가 결과에 영향을 주기 때문에 입력/출력이 겹치면 안 돼요.

더 알아보기 (Learn more)

cppreference