std:: clamp
|
Definiert im Header
<algorithm>
|
||
|
template
<
class
T
>
constexpr const T & clamp ( const T & v, const T & lo, const T & hi ) ; |
(1) | (seit C++17) |
|
template
<
class
T,
class
Compare
>
constexpr
const
T
&
clamp
(
const
T
&
v,
const
T
&
lo,
const
T
&
hi,
|
(2) | (seit C++17) |
Wenn der Wert von
v
innerhalb des Bereichs
[
lo
,
hi
]
liegt, wird
v
zurückgegeben; andernfalls wird die nächstgelegene Grenze zurückgegeben.
Wenn lo größer als hi ist, ist das Verhalten undefiniert.
-
↑
Falls
NaNvermieden wird, kannTein Gleitkommatyp sein.
Inhaltsverzeichnis |
Parameter
| v | - | der zu begrenzende Wert |
| lo, hi | - | die Grenzen, zwischen denen v begrenzt werden soll |
| comp | - |
Vergleichsfunktionsobjekt (d.h. ein Objekt, das die Anforderungen von
Compare
erfüllt), das
true
zurückgibt, wenn das erste Argument
kleiner
als das zweite ist.
Die Signatur der Vergleichsfunktion sollte äquivalent zu Folgender sein: bool cmp ( const Type1 & a, const Type2 & b ) ;
Obwohl die Signatur keine
const
&
benötigt, darf die Funktion die übergebenen Objekte nicht modifizieren und muss alle Werte der Typen (möglicherweise const)
|
Rückgabewert
Referenz auf lo falls v kleiner als lo , Referenz auf hi falls hi kleiner als v , andernfalls Referenz auf v .
Komplexität
Mögliche Implementierung
| 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; } |
Hinweise
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 ist hängend
Wenn v äquivalent zu einer der Grenzen verglichen wird, wird eine Referenz auf v zurückgegeben, nicht auf die Grenze.
| Feature-Test Makro | Wert | Std | Feature |
|---|---|---|---|
__cpp_lib_clamp
|
201603L
|
(C++17) |
std::clamp
|
Beispiel
#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'; }
Ausgabe:
[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
Siehe auch
|
gibt den kleineren der gegebenen Werte zurück
(Funktions-Template) |
|
|
gibt den größeren der gegebenen Werte zurück
(Funktions-Template) |
|
|
(C++20)
|
prüft, ob ein ganzzahliger Wert im Wertebereich eines gegebenen Ganzzahltyps liegt
(Funktions-Template) |
|
(C++20)
|
begrenzt einen Wert zwischen einem Paar von Grenzwerten
(Algorithmus-Funktionsobjekt) |