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{})로 값을 비교해요. 이때 TLessThanComparable이어야 해요.
  • 2번 오버로드 — 비교 함수 comp로 값을 비교해요.

반환값 (Return value)

vlo보다 작으면 lo, hiv보다 작으면 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;
}

더 알아보기 (Learn more)

cppreference