std::minmax_element în C++

Găsește într-o singură parcurgere atât cel mai mic, cât și cel mai mare element dintr-un interval.

Sintaxă
std::pair<ForwardIt, ForwardIt> minmax_element(ForwardIt first, ForwardIt last);

Ce face std::minmax_element

std::minmax_element returnează o pereche de iteratori {minim, maxim}. Face cel mult aproximativ 1,5·n comparații, mai puțin decât apelurile separate la min_element și max_element.

Diferență subtilă: dacă maximul apare de mai multe ori, se returnează ultima apariție (spre deosebire de max_element, care o returnează pe prima).

Parametri

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

Ce returnează

std::pair de iteratori (minim, maxim).

Exemple

Exemplul 1: Amplitudinea temperaturilor

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

int main() {
    std::vector<double> temp{4.5, 12.0, -2.5, 8.0, 15.5, 1.0};

    auto [mic, mare] = std::minmax_element(temp.begin(), temp.end());
    std::println("Minimă: {:.1f}, maximă: {:.1f}, diferență: {:.1f}", *mic, *mare, *mare - *mic);
}

Rezultat

Minimă: -2.5, maximă: 15.5, diferență: 18.0

Exemplul 2: Ultima apariție a maximului

Maximul 9 apare pe pozițiile 1 și 3; minmax_element o alege pe ultima, max_element pe prima.

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

int main() {
    std::vector<int> v{4, 9, 2, 9, 2};

    auto [mic, mare] = std::ranges::minmax_element(v);
    std::println("minmax_element: minim la {}, maxim la {}", mic - v.begin(), mare - v.begin());
    std::println("max_element: maxim la {}", std::ranges::max_element(v) - v.begin());
}

Rezultat

minmax_element: minim la 2, maxim la 3
max_element: maxim la 1

Greșeli frecvente

  • Apelezi funcția pe un interval gol și dereferențiezi rezultatul: ambii iteratori sunt last.

Comenzi înrudite

  • std::min_element: Găsește cel mai mic (min_element) sau cel mai mare (max_element) element dintr-un interval și returnează un iterator.
  • std::minmax: Returnează dintr-un singur apel o pereche formată din cea mai mică și cea mai mare valoare.
  • std::clamp: Limitează o valoare la un interval: o aduce la minim dacă e prea mică și la maxim dacă e prea mare.