08.10
2020
É normal precisar selecionar o mínimo e o máximo de um conjunto de dados, e a STL conta com funções específicas para determinar mínimos e máximos, alguns referem-se a valores discretos, outros a faixas de valores em containers.
As funções min e maxretornam o menor e maior valores dentre os dois parâmetros, respectivamente. A função minmax retorna o valor mínimo e o valor máximo dentre os dois parâmetros, em um objeto std::pair
Já as funções min_elements, max elements e minmax_elements, tem as mesmas funções porém além de aceitarem containers em seus parâmetros, retornam uma referência, para caso de arrays, ou um iterator para o caso de containers.
Em ambos os casos é possível definir uma função ou uma classe que faz a comparação das referências nos containers ou nos valores dos parâmetros.
Vamos montar um exemplo com as funções para ilustrar seu uso:
#include <algorithm>
#include <iostream>
int main() {
int v[] = {5, 35, 20, 4, 10, 23, 12, 22, 15, 9};
int n = sizeof(v) / sizeof(int);
std::cout << "Comparando primeiro e ultimo elemento: " << std::endl;
std::cout << "\tMinimo: " << std::min(v[0], v[9]) << std::endl;
std::cout << "\tMaximo: " << std::max(v[0], v[9]) << std::endl;
std::pair<int, int> mm = std::minmax(v[0], v[9]);
std::cout << "\tMin: " << mm.first << "\tMax: " << mm.second << std::endl;
std::cout << "Comparando todos elementos: " << std::endl;
std::cout << "\tMinimo: " << *std::min_element(v, v + n) << std::endl;
std::cout << "\tMaximo: " << *std::max_element(v, v + n) << std::endl;
std::pair<int*, int*> mmp = std::minmax_element(v, v + n);
std::cout << "\tMin: " << *mmp.first << "\tMax: " << *mmp.second << std::endl;
}
Em todo o exemplo utilizamos um array primitivo do C++ ao invés de containers, porém a utilização de containers é muito parecida, exceto que os parâmetros nas funções element são passados como iterators para o início (begin()) e final (end()) do container.
Note que não há razão de utilizar as funções min_element, max_elemement e minmax_element em certos containers que já são ordenados, por exemplo:
- std::list
- std::map
- std::set