std:: clamp
|
定義先ヘッダ
<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,
|
(2) | (C++17以降) |
v
の値が
[
lo
,
hi
]
の範囲内にある場合は
v
を返し、範囲外の場合は最も近い境界値を返します。
lo が hi より大きい場合、動作は未定義です。
-
↑
NaNが回避される場合、Tは浮動小数点型でも可能です。
目次 |
パラメータ
| v | - | クランプする値 |
| lo, hi | - | v をクランプする境界値 |
| comp | - |
比較関数オブジェクト(つまり
Compare
要件を満たすオブジェクト)。最初の引数が2番目の引数より
小さい
場合に
true
を返す。
比較関数のシグネチャは以下と同等であるべき: bool cmp ( const Type1 & a, const Type2 & b ) ;
シグネチャに
const
&
が含まれている必要はないが、関数は渡されたオブジェクトを変更してはならず、
値カテゴリ
に関係なく型(おそらくconstの)
|
戻り値
lo が v より大きい場合は lo を参照し、 hi が v より小さい場合は hi を参照し、それ以外の場合は v を参照します。
計算量
実装例
| 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
by reference produces a dangling reference if one of the parameters is a temporary and that parameter is returned:
int n = -1; const int& r = std::clamp(n, 0, 255); // r はダングリング参照となる
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)
|
整数値が指定された整数型の範囲内にあるかどうかをチェックする
(関数テンプレート) |
|
(C++20)
|
値を境界値のペアの間にクランプする
(アルゴリズム関数オブジェクト) |