Constrained algorithms and algorithms on ranges(C++20) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Constrained algorithms, e.g.ranges::copy,ranges::sort, ... | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Execution policies(C++17) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Numeric operations | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Operations on uninitialized memory | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Defined in header <algorithm> | ||
template<class T> constexprconst T& clamp(const T& v,const T& lo,const T& hi); | (1) | (since C++17) |
template<class T,class Compare> constexprconst T& clamp(const T& v,const T& lo,const T& hi, | (2) | (since C++17) |
If the value ofv is within[
lo,
hi]
, returnsv; otherwise returns the nearest boundary.
Iflo is greater thanhi, the behavior is undefined.
NaN
is avoided,T
can be a floating-point type.Contents |
v | - | the value to clamp |
lo, hi | - | the boundaries to clampv to |
comp | - | comparison function object (i.e. an object that satisfies the requirements ofCompare) which returnstrue if the first argument isless than the second. The signature of the comparison function should be equivalent to the following: bool cmp(const Type1& a,const Type2& b); While the signature does not need to haveconst&, the function must not modify the objects passed to it and must be able to accept all values of type (possibly const) |
Reference tolo ifv is less thanlo, reference tohi ifhi is less thanv, otherwise reference tov.
clamp (1) |
---|
template<class T>constexprconst T& clamp(const T& v,const T& lo,const T& hi){return clamp(v, lo, hi, less{});} |
clamp (2) |
template<class T,class Compare>constexprconst 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;constint& r= std::clamp(n,0,255);// r is dangling
Ifv compares equivalent to either bound, returns a reference tov, not the bound.
Feature-test macro | Value | Std | Feature |
---|---|---|---|
__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(constint 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
returns the smaller of the given values (function template)[edit] | |
returns the greater of the given values (function template)[edit] | |
(C++20) | checks if an integer value is in the range of a given integer type (function template)[edit] |
(C++20) | clamps a value between a pair of boundary values (algorithm function object)[edit] |