std::clamp
提供: cppreference.com
<tbody>
</tbody>
| ヘッダ <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以上) |
1)
v が lo より小さい場合は lo を返し、そうでなく hi が v より小さい場合は hi を返し、そうでなければ v を返します。 値を比較するために operator< を使用します。2) (1) と同じですが、値を比較するために
comp を使用します。lo の値が hi より大きい場合、動作は未定義です。
引数
| v | - | クランプする値 |
| lo,hi | - | v をクランプする境界
|
| comp | - | 第1引数が第2引数より小さい場合に true を返す、比較関数オブジェクト (Compare の要件を満たすオブジェクト)。比較関数のシグネチャは以下と同等であるべきです。
シグネチャが |
| 型の要件 | ||
-オーバロード (1) を使用するためには T は LessThanComparable の要件を満たさなければなりません。 ただし、 NaN が避けられていれば、 T は浮動小数点型でも構いません。
| ||
戻り値
v が lo より小さい場合は lo を指す参照、 hi が v より小さい場合は hi を指す参照、そうでなければ v を指す参照。
計算量
多くとも2回の比較。
実装例
| 1つめのバージョン |
|---|
template<class T>
constexpr const T& clamp( const T& v, const T& lo, const T& hi )
{
assert( !(hi < lo) );
return (v < lo) ? lo : (hi < v) ? hi : v;
}
|
| 2つめのバージョン |
template<class T, class Compare>
constexpr const T& clamp( const T& v, const T& lo, const T& hi, Compare comp )
{
assert( !comp(hi, lo) );
return comp(v, lo) ? lo : comp(hi, v) ? hi : v;
}
|
ノート
引数のいずれかが右辺値で、その引数が返された場合、 std::clamp の結果を参照でキャプチャすると、ダングリング参照が生成されます。
int n = -1;
const int& r = std::clamp(n, 0, 255);
// r はダングリングです。
v がいずれかの境界と同等な場合は、境界でなく v を指す参照が返されます。
例
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
関連項目
| 指定された値の小さい方を返します (関数テンプレート) | |
| 指定された値の大きい方を返します (関数テンプレート) |