std::clamp
提供: cppreference.com
ヘッダ <algorithm> で定義 | ||
template<class T> constexprconst T& clamp(const T& v, const T& lo, const T& hi ); | (1) | (C++17以上) |
template<class T, class Compare> constexprconst T& clamp(const T& v, const T& lo, const T& hi, Compare comp ); | (2) | (C++17以上) |
1)
v
が lo
より小さい場合は lo
を返し、そうでなく hi
が v
より小さい場合は hi
を返し、そうでなければ v
を返します。 値を比較するために operator< を使用します。2)(1) と同じですが、値を比較するために
comp
を使用します。lo
の値が hi
より大きい場合、動作は未定義です。
目次 |
[編集]引数
v | - | クランプする値 |
lo,hi | - | v をクランプする境界 |
comp | - | 第1引数が第2引数より小さい場合に true を返す、比較関数オブジェクト (Compare の要件を満たすオブジェクト)。 比較関数のシグネチャは以下と同等であるべきです。 bool cmp(const Type1 &a, const Type2 &b); シグネチャが const& を持つ必要はありませんが、関数は渡されたオブジェクトを変更してはならず、値カテゴリに関わらず |
型の要件 | ||
-オーバロード (1) を使用するためには T は LessThanComparable の要件を満たさなければなりません。 |
[編集]戻り値
v
が lo
より小さい場合は lo
を指す参照、 hi
が v
より小さい場合は hi
を指す参照、そうでなければ v
を指す参照。
[編集]計算量
多くとも2回の比較。
[編集]実装例
1つめのバージョン |
---|
template<class T>constexprconst T& clamp(const T& v, const T& lo, const T& hi ){return clamp( v, lo, hi, std::less<>());} |
2つめのバージョン |
template<class T, class Compare>constexprconst T& clamp(const T& v, const T& lo, const T& hi, Compare comp ){returnassert(!comp(hi, lo)), comp(v, lo)? lo : comp(hi, v)? hi : v;} |
[編集]ノート
引数のいずれかが右辺値で、その引数が返された場合、
std::clamp
の結果を参照でキャプチャすると、ダングリング参照が生成されます。 int n =-1;constint& r = std::clamp(n, 0, 255);// r is dangling
v
がいずれかの境界と同等な場合は、境界でなく v
を指す参照が返されます。
浮動小数点の T
に対しては、 NaN
が避けられる場合にのみ動作します。
[編集]例
Run this code
#include <cstdint>#include <algorithm>#include <iostream>#include <iomanip>#include <random> int main(){std::mt19937 g(std::random_device{}());std::uniform_int_distribution<> d(-300, 300);std::cout<<" raw clamped to int8_t clamped to uint8_t\n";for(int n =0; n <5;++n){int v = d(g);std::cout<<std::setw(4)<< v <<std::setw(20)<< std::clamp(v, INT8_MIN, INT8_MAX)<<std::setw(21)<< std::clamp(v, 0, UINT8_MAX)<<'\n';}}
出力例:
.raw clamped to int8_t clamped to uint8_t 168 127 168 128 127 128 -137 -128 0 40 40 40 -66 -66 0
[編集]関連項目
指定された値の小さい方を返します (関数テンプレート) | |
指定された値の大きい方を返します (関数テンプレート) |