std::clamp
来自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) 要求的对象),如果首个实参小于 第二个,则返回 true。 比较函数的签名应等价于如下: bool cmp(const Type1 &a, const Type2 &b); 虽然签名不必有 const&,函数也不能修改传递给它的对象,而且必须能够接受(可有 const 限定的)类型 |
返回值
在 v 小于 lo 时返回 lo 的引用,在 hi 小于 v 时返回 hi 的引用,否则返回到 v 的引用。
复杂度
2) 最多应用两次比较函数 comp。
可能的实现
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 悬垂
如果 v 与边界之一比较相等,那么会返回到 v 的引用,而不是到边界的引用。
功能特性测试宏 | 值 | 标准 | 功能特性 |
---|---|---|---|
__cpp_lib_clamp |
201603L | (C++17) | std::clamp
|
示例
运行此代码
#include <algorithm> #include <cstdint> #include <iomanip> #include <iostream> int main() { std::cout << "[原始] " "[" << 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'; }
输出:
[原始] [-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) |
在一对边界值间夹一个值 (niebloid) |