std::clamp în C++

Limitează o valoare la un interval: o aduce la minim dacă e prea mică și la maxim dacă e prea mare.

Sintaxă
const T& clamp(const T& valoare, const T& minim, const T& maxim);

Ce face std::clamp

std::clamp(v, lo, hi) returnează lo dacă v < lo, hi dacă v > hi, altfel chiar v. Înlocuiește combinația std::max(lo, std::min(v, hi)).

Este folosit pentru volum, procente, coordonate pe ecran sau note care trebuie să rămână între 1 și 10. Condiție: lo nu are voie să fie mai mare decât hi.

Parametri

Parametru Descriere
valoare Valoarea de limitat.
minim, maxim Capetele intervalului permis (minim <= maxim).

Ce returnează

Valoarea limitată.

Exemple

Exemplul 1: Volum între 0 și 100

#include <algorithm>
#include <print>

int main() {
    for (int volum : {-20, 45, 130}) {
        std::println("{} -> {}", volum, std::clamp(volum, 0, 100));
    }
}

Rezultat

-20 -> 0
45 -> 45
130 -> 100

Exemplul 2: Nota finală între 1 și 10

#include <algorithm>
#include <print>

int main() {
    double nota = 9.4;
    double bonus = 1.5;

    double finala = std::clamp(nota + bonus, 1.0, 10.0);
    std::println("Nota finală: {:.2f}", finala);
}

Rezultat

Nota finală: 10.00

Greșeli frecvente

  • Inversezi capetele (std::clamp(x, 100, 0)): comportament nedefinit.
  • Amesteci tipuri, ca std::clamp(x, 0, 1) cu x de tip double: nu compilează. Scrie 0.0 și 1.0.

Comenzi înrudite

  • std::min: Returnează cea mai mică dintre două valori sau dintr-o listă de valori scrisă între acolade.
  • std::max: Returnează cea mai mare dintre două valori sau dintr-o listă de valori scrisă între acolade.
  • std::lerp: Interpolare liniară: valoarea aflată la fracțiunea t pe drumul dintre a și b (a + t·(b − a)).