std::clamp
| Défini dans l'en-tête <algorithm>
|
||
template< class T >
constexpr const T& clamp( const T& v, const T& lo, const T& hi );
|
(1) | (depuis C++17) |
template< class T, class Compare >
constexpr const T& clamp( const T& v, const T& lo, const T& hi,
Compare comp );
|
(2) | (depuis C++17) |
Si la valeur de v est dans [lo, hi], renvoie v ; sinon renvoie la limite la plus proche.
operator<(jusqu'à C++20)std::less{}(depuis C++20) pour comparer les valeurs.comp pour comparer les valeurs.Si lo est supérieur à hi, le comportement est indéfini.
- ↑ Si
NaNest évité,Tpeut être un type à virgule flottante.
Paramètres
| v | - | la valeur à contraindre |
| lo, hi | - | les limites entre lesquelles contraindre v
|
| comp | - | objet fonction de comparaison (c'est-à-dire un objet qui satisfait aux exigences de Compare) qui renvoie true si le premier argument est inférieur au second.La signature de la fonction de comparaison doit être équivalente à ce qui suit :
Bien que la signature n'ait pas besoin d'avoir |
Valeur de retour
Référence à lo si v est inférieur à lo, référence à hi si hi est inférieur à v, sinon référence à v.
Complexité
operator<(jusqu'à C++20)std::less{}(depuis C++20).comp.Implémentation possible
| 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;
}
|
Notes
Capturer le résultat de std::clamp par référence produit une référence pendante si l'un des paramètres est une temporaire et que ce paramètre est renvoyé :
int n = -1;
const int& r = std::clamp(n, 0, 255); // r is dangling
Si v est équivalent à l'une des bornes, renvoie une référence à v, pas à la borne.
| Macro de test de fonctionnalité | Valeur | Std | Fonctionnalité |
|---|---|---|---|
__cpp_lib_clamp |
201603L |
(C++17) | std::clamp
|
Exemple
#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';
}
Sortie :
[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
Voir aussi
| renvoie la plus petite des valeurs données (modèle de fonction & objet fonction d'algorithme) | |
(C++20) |
|
| renvoie la plus grande des valeurs données (modèle de fonction & objet fonction d'algorithme) | |
(C++20) |
|
(C++20) |
vérifie si une valeur entière est dans la plage d'un type entier donné (modèle de fonction) |
(C++20) |
contraint une valeur entre une paire de valeurs limites (objet fonction d'algorithme) |