midpoint — std::midpoint

midpoint — std::midpoint (중간값)

std::midpoint는 **정수, 부동 소수점, 또는 포인터 ab의 중간값(midpoint)**을 계산해요. C++20에서 도입됐어요.

오버플로 없이 안전하게 ab의 가운데 값을 구하는 유틸리티예요.

출처: cppreference

본문

// <numeric> 헤더, C++20
template< class T >
constexpr T midpoint( T a, T b ) noexcept;   // (1) 산술 타입

template< class T >
constexpr T* midpoint( T* a, T* b );          // (2) 포인터
  • (1) Tbool이 아닌 산술 타입일 때 사용 가능.
  • (2) T가 객체 타입일 때 사용 가능. 포인터에 대해서도 중간점을 계산.
#include <numeric>

std::midpoint(2, 4);       // 3 (정수)
std::midpoint(0.0, 10.0);  // 5.0 (부동)
std::midpoint(-10, 10);    // 0

int arr[10];
int* mid = std::midpoint(arr, arr + 9);  // 중간 원소 포인터

왜 안전한가

(a + b) / 2와 달리 정수 오버플로를 일으키지 않아요.

// 위험한 방식
int big = std::numeric_limits<int>::max();
// int mid = (big + big) / 2;   // 오버플로 → UB

// 안전한 방식
int mid = std::midpoint(big, big);   // big (오버플로 없음)

특징

  • constexpr, noexcept — 컴파일 타임에도 안전하게 사용 가능.
  • 정수·부동·포인터 모두 지원.
  • 부동 소수점은 반올림 규칙이 정의되어 있어요.
// 바이너리 탐색에서 안전한 중간 계산
template<typename It, typename T>
It lower_bound(It first, It last, const T& v) {
    while (first < last) {
        auto mid = first + std::midpoint(std::distance(first, last), 0);
        // ...
    }
}

정렬·이진 탐색·분할 정복 등에서 중간 인덱스를 계산할 때 오버플로를 걱정 없이 쓰는 표준 도구예요.

더 알아보기 (Learn more)

cppreference