Algoritmi și reprezentări
Algoritmii reprezintă funcții speciale definite în modulul <algorithm>, care se execută asupra containerelor de elemente. Vom analiza cei mai comuni.
Elementele minime și maxime
Funcțiile std::min_element și std::max_element returnează respectiv elementele minime și maxime dintr-un anumit interval. Ca colecție de elemente poate fi utilizat un container sau un tablou. Intervalul de elemente este definit prin iterațiile de început și sfârșit ale containerului/tabloului.
#include <iostream>
#include <vector>
#include <algorithm>
int main()
{
std::vector<int> numbers { 1, 2, 3, 4, 5, 6, 7, 8};
std::cout << "Min: " << *std::min_element(begin(numbers), end(numbers)) << std::endl;
std::cout << "Max: " << *std::max_element(begin(numbers), end(numbers)) << std::endl;
}
Aici găsim elementele minime și maxime din vectorul numbers. În ambele cazuri, intervalul este întregul container — de la iteratorul begin(numbers) până la iteratorul end(numbers). Rezultatul fiecărei funcții este, de asemenea, un iterator. De aceea, pentru a obține valoarea (valoarea minimă/maximă), aplicăm operația de dereferențiere: *std::min_element(...). Ieșirea în consolă va fi:
Min: 1
Max: 8
Deoarece intervalul de căutare al valorilor nu reprezintă neapărat întregul container, ci poate fi doar o parte a acestuia, limitată de iterați, putem găsi valorile maxime/minime într-un anumit interval, de exemplu, de la al doilea element până la penultimul:
std::cout << "Min: " << *std::min_element(begin(numbers) + 1, end(numbers) - 1) << std::endl;
std::cout << "Max: " << *std::max_element(begin(numbers) + 1, end(numbers) - 1) << std::endl;
De asemenea, pentru a obține valorile minime/maxime, se poate utiliza funcția std::minmax_element(), care, de asemenea, folosește iterații pentru a defini intervalul de căutare. Însă rezultatul este returnat sub forma unui obiect std::pair<iterator, iterator>:
#include <iostream>
#include <vector>
#include <algorithm>
int main()
{
std::vector<int> numbers { 1, 2, 3, 4, 5, 6, 7, 8};
const auto [min, max] = std::minmax_element(begin(numbers), end(numbers));
std::cout << "Min: " << *min << std::endl;
std::cout << "Max: " << *max << std::endl;
}
Astfel, std::minmax_element returnează atât elementul minim, cât și pe cel maxim sub forma unui std::pair, iar accesarea valorii minime și maxime se face prin dereferențierea iteratoarelor returnate.