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.
operator< (hasta C++20)std::less{} (desde C++20) para comparar los valores.comp para comparar los valores.Si lo es mayor que hi, el comportamiento no está definido.
- ↑ Si se evita
NaN,Tpuede ser un tipo de punto flotante.
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:
Mientras que la signatura no necesita ser |
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.
Complejidad
operator< (hasta C++20)std::less{} (desde C++20).comp.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;
}
|
Notas
Capturar el resultado de 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
|
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 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) |