◐ Shell
clean mode source ↗

std::clamp - cppreference.com

De cppreference.com

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.

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.

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. ​

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

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.

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) [editar]
Devuelve el mayor de dos elementos
(plantilla de función) [editar]
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]