std::clamp
| Defined in header <algorithm>
|
||
template< class T >
constexpr const T& clamp( const T& v, const T& lo, const T& hi );
|
(1) | (since C++17) |
template< class T, class Compare >
constexpr const T& clamp( const T& v, const T& lo, const T& hi,
Compare comp );
|
(2) | (since C++17) |
Returns a reference to the value in [lo, hi] that is closest to v.
operator<(until C++20)std::less{}(since C++20) to compare the values.comp to compare the values.If lo is greater than hi, the behavior is undefined.
- ↑ If
NaNis avoided,Tcan be a floating-point type.
Parameters
| v | - | the value to clamp |
| lo, hi | - | the boundaries to clamp v to
|
| comp | - | comparison function object (i.e. an object that satisfies the requirements of Compare) which returns true if the first argument is less than the second.The signature of the comparison function should be equivalent to the following:
While the signature does not need to have |
Return value
lo if v is less than lo, or hi if hi is less than v, otherwise v.
Complexity
operator<(until C++20)std::less{}(since C++20).comp.Notes
Capturing the result of 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 is dangling
If v compares equivalent to either bound, returns v rather than the bound.
| Feature-test macro | Value | Std | Feature |
|---|---|---|---|
__cpp_lib_clamp |
201603L |
(C++17) | std::clamp
|
Possible implementation
| 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;
}
|
Example
#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';
}
Output:
[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
See also
(C++20) |
clamps a value between a pair of boundary values (algorithm function object) |
| returns the smaller of the given values (function template & algorithm function object) | |
(C++20) |
|
| returns the greater of the given values (function template & algorithm function object) | |
(C++20) |
|
(C++20) |
checks if an integer value is in the range of a given integer type (function template) |