Namensräume
Varianten
Aktionen

std::clamp

Von cppreference.com
< cpp‎ | algorithm
 
 
Algorithmenbibliothek
Beschränkte Algorithmen und Algorithmen für Bereiche (C++20)
Beschränkte Algorithmen, z.B. ranges::copy, ranges::sort, ...
Ausführungsrichtlinien (C++17)
Nicht-modifizierende Sequenzoperationen
Stapeloperationen
(C++17)
Suchoperationen
(C++11)                (C++11)(C++11)

Modifizierende Sequenzoperationen
Kopieroperationen
(C++11)
(C++11)
Tauschoperationen
Transformationsoperationen
Generierungsoperationen
Entfernungsoperationen
Ordnungsändernde Operationen
(bis C++17)(C++11)
(C++20)(C++20)
Stichprobenoperationen
(C++17)

Sortier- und verwandte Operationen
Partitionierungsoperationen
Sortieroperationen
Binäre Suchoperationen
(auf partitionierten Bereichen)
Mengenoperationen (auf sortierten Bereichen)
Zusammenführungsoperationen (auf sortierten Bereichen)
Heapoperationen
Minimum/Maximum-Operationen
(C++11)
clamp
(C++17)
Lexikographische Vergleichsoperationen
Permutationsoperationen
C-Bibliothek
Numerische Operationen
Operationen auf uninitialisiertem Speicher
 
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 [lohi] liegt, wird v zurückgegeben; andernfalls wird die nächstgelegene Grenze zurückgegeben.

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

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

  1. Wenn NaN vermieden wird, kann T ein Fließkommatyp sein.

Inhalt

[bearbeiten] Parameter

v - der zu klemmende Wert
lo, hi - die Grenzen, auf die v geklemmt werden soll
comp - Ein Vergleichsfunktions-Objekt (d.h. ein Objekt, das die Anforderungen an Compare erfüllt), das true zurückgibt, wenn das erste Argument *weniger* als das zweite ist.

Die Signatur der Vergleichsfunktion sollte äquivalent zu Folgendem sein

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

Obwohl die Signatur nicht const& haben muss, darf die Funktion die übergebenen Objekte nicht modifizieren und muss alle Werte vom Typ (möglicherweise const) Type1 und Type2 unabhängig von der Wertkategorie akzeptieren (daher ist Type1& nicht erlaubt, und auch nicht Type1, es sei denn, für Type1 ist ein Move äquivalent zu einer Kopie(seit C++11)).
Die Typen Type1 und Type2 müssen so beschaffen sein, dass ein Objekt vom Typ T implizit in beide konvertiert werden kann.

[bearbeiten] Rückgabewert

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

[bearbeiten] 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.

[bearbeiten] 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;
}

[bearbeiten] Hinweise

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

[bearbeiten] 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

[bearbeiten] Siehe auch

Gibt den kleineren der beiden Werte zurück
(Funktionstemplate) [edit]
Gibt den größeren der beiden Werte zurück
(Funktionstemplate) [edit]
(C++20)
prüft, ob ein Ganzzahlwert im Bereich eines gegebenen Ganzzahltyps liegt
(Funktionsvorlage) [edit]
klemmt einen Wert zwischen einem Paar von Grenzwerte
(Algorithmus-Funktionsobjekt)[bearbeiten]