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,
|
(2) | (depuis C++17) |
Si la valeur de
v
est comprise dans l'intervalle
[
lo
,
hi
]
, retourne
v
; sinon retourne la limite la plus proche.
Si lo est supérieur à hi , le comportement est indéfini.
-
↑
Si
NaNest évité,Tpeut être un type à virgule flottante.
Table des matières |
Paramètres
| v | - | la valeur à limiter |
| lo, hi | - | les bornes entre lesquelles limiter v |
| comp | - |
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 : bool cmp ( const Type1 & a, const Type2 & b ) ;
Bien que la signature n'ait pas besoin d'avoir
const
&
, la fonction ne doit pas modifier les objets qui lui sont passés et doit pouvoir accepter toutes les valeurs de type (éventuellement const)
|
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é
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
std::clamp
by reference produces a dangling reference if one of the parameters is a temporary and that parameter is returned:
int n = -1; const int& r = std::clamp(n, 0, 255); // r est pendante
Si v est équivalent à l'une des bornes, retourne une référence à v , et non à la borne.
| Macro de test de fonctionnalité | Valeur | Norme | 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) |
|
|
renvoie la plus grande des valeurs données
(modèle de fonction) |
|
|
(C++20)
|
vérifie si une valeur entière est dans la plage d'un type entier donné
(modèle de fonction) |
|
(C++20)
|
limite une valeur entre une paire de valeurs limites
(objet fonction d'algorithme) |