Espacios de nombres
Variantes
Acciones

std::clamp

De cppreference.com
< cpp‎ | algorithm
 
 
Biblioteca de algoritmos
Políticas de ejecución (C++17)
Operaciones de secuencia no modificantes
(C++11)(C++11)(C++11)
(C++17)
Operaciones de secuencia modificantes
Operaciones en almacenamiento no inicializado
Operaciones de partición
Operaciones de ordenación
(C++11)
Operaciones de búsqueda binaria
Operaciones de conjuntos (en rangos ordenados)
Operaciones de pila
(C++11)
Operaciones mínimo/máximo
(C++11)
clamp
(C++17)
Permutaciones
Operaciones numéricas
Bibliotecas C
 
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 [lohi), devuelve v; de lo contrario, devuelve el límite más cercano.

1) Utiliza operator< (hasta C++20)std::less{} (desde C++20) para comparar los valores.
Si T no es LessThanComparable, el comportamiento no está definido.[1]
2) Utiliza la función de comparación comp para comparar los valores.

Si lo es mayor que hi, el comportamiento no está definido.

  1. 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 const) Type1 y Type2 a pesar de la categoría de valor (por consiguiente, no se permite a Type1 & , ni tampoco a Type1 a menos que para Type1 un movimiento sea equivalente a una copia (desde C++11)).
Los tipos Type1 y Type2 deben ser tales que un objeto de tipo T puede convertirse implícitamente a ambos. ​

[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

1) Como máximo dos comparaciones utilizando operator< (hasta C++20)std::less{} (desde C++20).
2) Como máximo dos aplicaciones de la función de comparación comp.

[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

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

[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) [editar]
Devuelve el mayor de dos elementos
(plantilla de función) [editar]
(C++20)
Comprueba si un valor entero se encuentra en el rango de un tipo entero dado
(plantilla de función) [editar]
Sujeta un valor entre un par de valores límite.
(niebloid) [editar]