std::clamp
From cppreference.com
| ヘッダー <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 を返します。それ以外の場合は、最も近い境界を返します。
2) 値を比較するために、比較関数 comp を使用します。
lo が hi より大きい場合、動作は未定義です。
- ↑
NaNを避ければ、Tは浮動小数点型にすることができます。
目次 |
[編集] パラメータ
| v | - | クランプする値 |
| lo, hi | - | v をクランプする境界 |
| comp | - | 比較関数オブジェクト(すなわち、Compareの要件を満たすオブジェクト)。最初の引数が2番目の引数より小さい場合にtrueを返す。 比較関数のシグネチャは、以下と同等でなければならない。 bool cmp(const Type1& a, const Type2& b); シグネチャにconst&は必須ではないが、関数は渡されたオブジェクトを変更してはならず、値カテゴリに関係なく、 |
[編集] 戻り値
v が lo より小さい場合は lo への参照、hi が v より小さい場合は hi への参照、それ以外の場合は v への参照を返します。
[編集] 計算量
2) 比較関数 comp を最大2回適用します。
[編集] 可能な実装
| 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) |
整数値が指定された整数型の範囲内にあるかを確認する (関数テンプレート) |
| (C++20) |
値を一対の境界値の間に制限する (アルゴリズム関数オブジェクト) |