std:: clamp
|
Definido en el encabezado
<algorithm>
|
||
|
template
<
class
T
>
constexpr const T & clamp ( const T & v, const T & lo, const T & hi ) ; |
(1) | (desde C++17) |
|
template
<
class
T,
class
Compare
>
constexpr
const
T
&
clamp
(
const
T
&
v,
const
T
&
lo,
const
T
&
hi,
|
(2) | (desde C++17) |
Si el valor de
v
está dentro del rango
[
lo
,
hi
]
, devuelve
v
; de lo contrario devuelve el límite más cercano.
Si lo es mayor que hi , el comportamiento es indefinido.
-
↑
Si se evita
NaN,Tpuede ser un tipo de punto flotante.
Contenidos |
Parámetros
| v | - | el valor a limitar |
| lo, hi | - | los límites entre los cuales limitar v |
| comp | - |
objeto función de comparación (es decir, un objeto que satisface los requisitos de
Compare
) que devuelve
true
si el primer argumento es
menor
que el segundo.
La firma de la función de comparación debe ser equivalente a la siguiente: bool cmp ( const Type1 & a, const Type2 & b ) ;
Aunque la firma no necesita tener
const
&
, la función no debe modificar los objetos pasados a ella y debe poder aceptar todos los valores de tipo (posiblemente const)
|
Valor de retorno
Referencia a lo si v es menor que lo , referencia a hi si hi es menor que v , de lo contrario referencia a v .
Complejidad
Implementación posible
| 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; } |
Notas
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 está colgando
Si v se compara como equivalente a cualquiera de los límites, devuelve una referencia a v , no al límite.
| Macro de prueba de características | Valor | Std | Característica |
|---|---|---|---|
__cpp_lib_clamp
|
201603L
|
(C++17) |
std::clamp
|
Ejemplo
#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'; }
Salida:
[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
Véase también
|
devuelve el menor de los valores dados
(plantilla de función) |
|
|
devuelve el mayor de los valores dados
(plantilla de función) |
|
|
(C++20)
|
verifica si un valor entero está en el rango de un tipo entero dado
(plantilla de función) |
|
(C++20)
|
limita un valor entre un par de valores límite
(objeto función de algoritmo) |