std::clamp
Definido en el archivo de 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, Compare comp ); |
(2) | (desde C++17) |
Si el valor de v está dentro de [
lo,
hi)
, devuelve v; de lo contrario, devuelve el límite más cercano.
Si lo es mayor que hi, el comportamiento no está definido.
- ↑ Si se evita
NaN
,T
puede ser un tipo de punto flotante.
Contenido |
[editar] Parámetros
v | - | El valor a sujetar. |
lo, hi | - | Los límites a los cuales sujetar v .
|
comp | - | objeto función de comparación (es decir, un objeto que satisface los requerimientos de Compare) que devuelve true si el primer argumento es menor que el segundo. La signatura de la función de comparación deberá ser equivalente a lo siguiente: bool cmp(const Type1 &a, const Type2 &b); Mientras que la signatura no necesita ser const &, la función no debe modificar los objetos que se le pasaron y debe admitir todos los valores de los tipos (posiblemente |
[editar] Valor de retorno
Una referencia a lo
si v
es menor que lo
; una referencia a hi
si hi
es menor que v
; de lo contrario, una referencia a v
.
[editar] Complejidad
[editar] Posible implementación
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; } |
[editar] Notas
std::clamp
por referencia produce una referencia pendiente si uno de los parámetros es un temporal y ese parámetro se devuelve:
int n = -1; const int& r = std::clamp(n, 0, 255); // r es pendiente
Si v
se compara con el equivalente a cualquiera de los límites, devuelve una referencia a v
, no al límite.
Macro de Prueba de característica | Valor | Estándar | Comentario |
---|---|---|---|
__cpp_lib_clamp |
201603L | (C++17) | std::clamp
|
[editar] 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
[editar] Véase también
Devuelve el menor de los elementos (plantilla de función) | |
Devuelve el mayor de dos elementos (plantilla de función) | |
(C++20) |
Comprueba si un valor entero se encuentra en el rango de un tipo entero dado (plantilla de función) |
(C++20) |
Sujeta un valor entre un par de valores límite. (niebloid) |