std::clamp
来自 cppreference.cn
定义于头文件 <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&,但该函数不得修改传递给它的对象,并且必须能够接受类型为 |
[编辑] 返回值
如果 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 is dangling
如果 v 与任一边界的比较结果相等,则返回对 v 而不是边界的引用。
特性测试 宏 | 值 | Std | 特性 |
---|---|---|---|
__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 (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'; }
输出
[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
[编辑] 参见
返回给定值中较小的值 (函数模板) | |
返回给定值中较大的值 (函数模板) | |
(C++20) |
检查整数值是否在给定整数类型的范围内 (函数模板) |
(C++20) |
将值钳制在一对边界值之间 (算法函数对象) |