algorithm_clamp
algorithm_clamp (값을 범위로 제한)
std::clamp는 값 v를 하한 lo와 상한 hi 로 제한해요. v가 범위를 벗어나면 가장 가까운 경계값을 돌려주고, 범위 안이면 그대로 v를 돌려줘요.
출처: cppreference
본문
std::clamp는 [lo, hi] 범위에서 v에 가장 가까운 값에 대한 참조를 반환해요. <algorithm> 헤더에 정의되어 있어요. C++17부터 사용 가능해요.
template< class T >
constexpr const T& clamp( const T& v, const T& lo, const T& hi );
template< class T, class Compare >
constexpr const T& clamp( const T& v, const T& lo, const T& hi,
Compare comp );
- 1번 오버로드 —
operator<(즉std::less{})로 값을 비교해요. 이때T는LessThanComparable이어야 해요. - 2번 오버로드 — 비교 함수
comp로 값을 비교해요.
반환값 (Return value)
v가 lo보다 작으면 lo, hi가 v보다 작으면 hi, 그 외에는 v를 돌려줘요. v가 어느 경계와 동등하게 비교되면 경계 대신 v를 돌려줘요.
복잡도 (Complexity)
최대 두 번의 비교(또는 comp 적용)가 필요해요.
예제 (Example)
#include <algorithm>
#include <cstdint>
#include <iomanip>
#include <iostream>
int main()
{
std::cout << "[raw] "
<< "[" << INT8_MIN << ',' << INT8_MAX << "] "
<< "[0," << UINT8_MAX << "]\n";
for (const int v : {-129, -128, -1, 0, 42, 127, 128, 255, 256})
std::cout << std::setw(4) << v
<< std::setw(11) << std::clamp(v, INT8_MIN, INT8_MAX)
<< std::setw(8) << std::clamp(v, 0, UINT8_MAX) << '\n';
}
출력:
[raw] [-128,127] [0,255]
-129 -128 0
-128 -128 0
-1 -1 0
0 0 0
42 42 42
127 127 127
128 127 128
255 127 255
256 127 255
가능한 구현 (Possible implementation)
template<class T>
constexpr const T& clamp(const T& v, const T& lo, const T& hi)
{
return clamp(v, lo, hi, less{});
}
template<class T, class Compare>
constexpr const T& clamp(const T& v, const T& lo, const T& hi, Compare comp)
{
return comp(v, lo) ? lo : comp(hi, v) ? hi : v;
}