名稱空間
變體
操作

std::clamp

來自 cppreference.com
< cpp‎ | 演算法
 
 
演算法庫
有約束演算法與針對範圍的演算法 (C++20)
有約束的演算法,例如 ranges::copyranges::sort 等……
執行策略 (C++17)
排序及相關操作
劃分操作
排序操作
二分搜尋操作
(於已劃分範圍上)
集合操作(於已排序範圍上)
歸併操作(於已排序範圍上)
堆操作
最小/最大值操作
(C++11)
clamp
(C++17)
字典序比較操作
排列操作
C 庫
數值操作
未初始化記憶體上的操作
 
定義於標頭檔案 <algorithm>
template< class T >
constexpr const T& clamp( const T& v, const T& lo, const T& hi );
(1) (C++17 起)
template< class T, class Compare >

constexpr const T& clamp( const T& v, const T& lo, const T& hi,

                          Compare comp );
(2) (C++17 起)

如果 v 的值在 [lohi] 範圍內,則返回 v;否則返回最近的邊界。

1) 使用 operator<(C++20 前)std::less{}(C++20 起) 比較值。
如果 T 不是 LessThanComparable,則行為未定義。[1]
2) 使用比較函式 comp 比較值。

如果 lo 大於 hi,則行為未定義。

  1. 如果避免使用 NaN,則 T 可以是浮點型別。

目錄

[編輯] 引數

v - 要限制的值
lo, hi - 限制 v 的邊界
comp - 比較函式物件(即滿足 Compare 要求的物件),如果第一個引數“小於”第二個引數,則返回 true

比較函式的簽名應等效於以下內容

bool cmp(const Type1& a, const Type2& b);

雖然簽名不需要包含 const&,但函式不得修改傳遞給它的物件,並且必須能夠接受 Type1Type2 型別的所有值(可能為 const),而不管其 值類別(因此,不允許使用 Type1&,除非對於 Type1,移動等同於複製,否則也不允許使用 Type1(C++11 起))。
型別 Type1Type2 必須能夠讓型別 T 的物件隱式轉換為它們兩者。

[編輯] 返回值

如果 v 小於 lo,則返回對 lo 的引用;如果 hi 小於 v,則返回對 hi 的引用;否則返回對 v 的引用。

[編輯] 複雜度

1) 使用 operator<(C++20 前)std::less{}(C++20 起) 最多進行兩次比較。
2) 最多兩次應用比較函式 comp

[編輯] 可能實現

clamp (1)
template<class T>
constexpr const T& clamp(const T& v, const T& lo, const T& hi)
{
    return clamp(v, lo, hi, less{});
}
clamp (2)
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;
}

[編輯] 注意

如果引數之一是臨時變數且該引數被返回,則透過引用捕獲 std::clamp 的結果會產生懸空引用。
int n = -1;
const int& r = std::clamp(n, 0, 255); // r is dangling

如果 v 與任一邊界比較相等,則返回對 v 的引用,而不是對邊界的引用。

特性測試 標準 特性
__cpp_lib_clamp 201603L (C++17) std::clamp

[編輯] 示例

#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

[編輯] 參閱

返回給定值中較小的那個
(函式模板) [編輯]
返回給定值中較大的那個
(函式模板) [編輯]
(C++20)
檢查整數值是否在給定整數型別的範圍內
(函式模板) [編輯]
將值限制在邊界值對之間
(演算法函式物件)[編輯]