midpoint — std::midpoint
midpoint — std::midpoint (중간값)
std::midpoint는 **정수, 부동 소수점, 또는 포인터 a와 b의 중간값(midpoint)**을 계산해요. C++20에서 도입됐어요.
오버플로 없이 안전하게 a와 b의 가운데 값을 구하는 유틸리티예요.
출처: 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)
T가bool이 아닌 산술 타입일 때 사용 가능. - (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);
// ...
}
}
정렬·이진 탐색·분할 정복 등에서 중간 인덱스를 계산할 때 오버플로를 걱정 없이 쓰는 표준 도구예요.