Namespaces
Variants

std::clamp

Von de.cppreference.net
 
 
Algorithmenbibliothek
Eingeschränkte Algorithmen und Algorithmen auf Bereichen (C++20)
Eingeschränkte Algorithmen, z.B. ranges::copy, ranges::sort, ...
Nicht modifizierende Sequenzoperationen    
Stapeloperationen
(C++17)
Suchoperationen
Modifizierende Sequenzoperationen
Kopieroperationen
(C++11)
(C++11)
Tauschoperationen
Transformationsoperationen
Generierungsoperationen
Entfernungsoperationen
Reihenfolgeändernde Operationen
(bis C++17)(C++11)
(C++20)(C++20)
Stichprobenoperationen
(C++17)

Sortier- und verwandte Operationen
Partitionierungsoperationen
(C++11)    

Sortieroperationen
Binäre Suchoperationen
(auf partitionierten Bereichen)
Mengenoperationen (auf sortierten Bereichen)
Mischoperationen (auf sortierten Bereichen)
Haufenoperationen
Minimum/Maximum-Operationen
(C++11)
(C++17)
Lexikografische Vergleichsoperationen
Permutationsoperationen


 
Definiert in 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,
                          Compare comp );
(2) (seit C++17)

Wenn der Wert von v innerhalb von [lo, hi] liegt, wird v zurückgegeben; andernfalls wird die nächstgelegene Grenze zurückgegeben.

1) Verwendet operator<(bis C++20)std::less{}(seit C++20) zum Vergleichen der Werte.
Wenn T nicht LessThanComparable ist, ist das Verhalten undefiniert.[1]
2) Verwendet die Vergleichsfunktion comp zum Vergleichen der Werte.

Wenn lo größer als hi ist, ist das Verhalten undefiniert.

  1. ↑ Wenn NaN vermieden wird, kann T ein Gleitkommatyp sein.

Parameter

v - der zu begrenzende Wert
lo, hi - die Grenzen, auf die v begrenzt wird
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 der folgenden entsprechen:

bool cmp(const Type1& a, const Type2& b);

Während die Signatur nicht const& haben muss, darf die Funktion die ihr übergebenen Objekte nicht modifizieren und muss in der Lage sein, alle Werte des Typs (möglicherweise const) Type1 und Type2 unabhängig von der Wertkategorie zu akzeptieren (daher ist Type1& nicht erlaubt, ebenso wenig Type1 außer wenn für Type1 eine Verschiebung einer Kopie entspricht(seit C++11)).
Die Typen Type1 und Type2 müssen so sein, dass ein Objekt vom Typ T implizit in beide konvertiert werden kann.

Rückgabewert

Verweis auf lo, wenn v kleiner als lo ist, Verweis auf hi, wenn hi kleiner als v ist, andernfalls Verweis auf v.

Komplexität

1) Höchstens zwei Vergleiche mit operator<(bis C++20)std::less{}(seit C++20).
2) Höchstens zwei Anwendungen der Vergleichsfunktion comp.

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;
}

Anmerkungen

Das Erfassen des Ergebnisses von std::clamp per Referenz erzeugt eine hängende Referenz, wenn einer der Parameter ein temporäres Objekt ist und dieser Parameter zurückgegeben wird:

int n = -1;
const int& r = std::clamp(n, 0, 255); // r is dangling

Wenn v äquivalent zu einer der Grenzen ist, wird ein Verweis 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 angegebenen Werte zurück
(Funktionsschablone & Algorithmus-Funktionsobjekt)
gibt den größeren der angegebenen Werte zurück
(Funktionsschablone & Algorithmus-Funktionsobjekt)
(C++20)
prüft, ob ein ganzzahliger Wert im Bereich eines gegebenen Ganzzahltyps liegt
(Funktionsschablone)
begrenzt einen Wert zwischen einem Paar von Grenzwerten
(Algorithmus-Funktionsobjekt)