STL Algorithms: Mínimos e Máximos

por Fabio A. Mazzarino

É 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