std::min_element în C++

Găsește cel mai mic (min_element) sau cel mai mare (max_element) element dintr-un interval și returnează un iterator.

Sintaxă
ForwardIt min_element(ForwardIt first, ForwardIt last);
ForwardIt max_element(ForwardIt first, ForwardIt last);

Ce face std::min_element

Aceste funcții parcurg intervalul o dată și returnează un iterator către element, nu valoarea. Valoarea o obții cu *it, iar poziția cu it - v.begin(). Dacă există mai multe elemente egale cu extremul, se returnează primul.

Pe un interval gol returnează last, așa că verifică dacă vectorul este gol. Cu un comparator sau, în C++20, cu o proiecție, poți căuta după un câmp al unei structuri.

Parametri

Parametru Descriere
first, last Intervalul.
comp Opțional. Funcția de comparare.

Ce returnează

Iterator către elementul găsit, sau last pentru interval gol.

Exemple

Exemplul 1: Valoare și poziție

#include <algorithm>
#include <print>
#include <vector>

int main() {
    std::vector<int> vanzari{120, 340, 95, 410, 230};

    auto mic = std::min_element(vanzari.begin(), vanzari.end());
    auto mare = std::max_element(vanzari.begin(), vanzari.end());

    std::println("Cea mai slabă zi: ziua {} ({} lei)", mic - vanzari.begin() + 1, *mic);
    std::println("Cea mai bună zi: ziua {} ({} lei)", mare - vanzari.begin() + 1, *mare);
}

Rezultat

Cea mai slabă zi: ziua 3 (95 lei)
Cea mai bună zi: ziua 4 (410 lei)

Exemplul 2: Cel mai ieftin produs (proiecție C++20)

#include <algorithm>
#include <print>
#include <string>
#include <vector>

struct Produs {
    std::string nume;
    double pret;
};

int main() {
    std::vector<Produs> oferte{{"Telefon A", 1299.0}, {"Telefon B", 899.5}, {"Telefon C", 1049.0}};

    auto it = std::ranges::min_element(oferte, {}, &Produs::pret);
    std::println("{} la {:.2f} lei", it->nume, it->pret);

    auto scump = std::max_element(oferte.begin(), oferte.end(),
                                  [](const Produs& a, const Produs& b) { return a.pret < b.pret; });
    std::println("Cel mai scump: {}", scump->nume);
}

Rezultat

Telefon B la 899.50 lei
Cel mai scump: Telefon A

Greșeli frecvente

  • Faci *std::max_element(v.begin(), v.end()) pe un vector gol: dereferențiezi end(), comportament nedefinit.
  • Pentru max_element scrii comparatorul cu >. Comparatorul spune mereu „mai mic decât”; cu > obții de fapt minimul.

Comenzi înrudite

  • std::minmax_element: Găsește într-o singură parcurgere atât cel mai mic, cât și cel mai mare element dintr-un interval.
  • 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::sort: Sortează elementele dintr-un interval, crescător sau după o regulă dată de tine.