STL Algorithms: Permutações

por Fabio A. Mazzarino

As funções de permutações do STL são utilizadas para criar permutações de um conjunto de dados, ou seja exibir, uma a uma, todas as possibilidades de distribuição de dados. Pode ser muito útil em diversa aplicações.

Vamos começar com a sintaxe:

template <class BidirectionalIterator>
bool next_permutation (BidirectionalIterator first,
                       BidirectionalIterator last);
template <class BidirectionalIterator, class Compare>
bool next_permutation (BidirectionalIterator first,
                       BidirectionalIterator last, Compare comp);

A primeira opção de sintaxe é para elementos de tipo que já contam com comparadores. A segunda é para definir um comparador customizado, basicamente uma função equivalente a menor que (<).

Note que existe também a função prev_permutation, equivalentes a next_permutation, porém a ordem das permutações é inversa.

Agora vamos a um exemplo. Vamos definir cinco times e fazer as permutações para gerar a lista de jogos entre os times.


#include <algorithm>
#include <iostream>
#include <set>
#include <string>

int main() {
    std::string teams[] = {"Cardinals", "Falcons", "Panthers", "Bears", "Cowboys"};
    std::set<std::string> matches;
    do {
        std::string match = teams[0] + " x " + teams[1];
        matches.insert(match);
    } while (std::next_permutation(teams, teams + sizeof(teams) / sizeof(std::string)));

    std::cout << "Matches: " << std::endl;
    int ct = 0;
    for (std::set<std::string>::iterator it = matches.begin();
        it != matches.end();
        it++
    )
        std::cout << "#" << ++ct << ":\t" << *it << std::endl;

}

No primeiro loop são geradas todas as permutações entre os cinco times. Mas dentro do loop são gerados os jogos em uma string, e armazenados em um std::set, que vai evitar que sejam gerados jogos iguais mas invertidos, por exemplo, Cardinals x Falcons é equivalente a Falcons x Cardinals.

Já o segundo loop é só pra imprimir todos os jogos únicos que foram gerados.

A saída vai ser a seguinte:

Matches:
#1:     Cardinals x Falcons
#2:     Cardinals x Panthers
#3:     Cowboys x Bears
#4:     Cowboys x Cardinals
#5:     Cowboys x Falcons
#6:     Cowboys x Panthers
#7:     Falcons x Bears
#8:     Falcons x Cardinals
#9:     Falcons x Cowboys
#10:    Falcons x Panthers
#11:    Panthers x Bears
#12:    Panthers x Cardinals
#13:    Panthers x Cowboys
#14:    Panthers x Falcons

Com um loop simples, o primeiro do código, fizemos a permutação dos elementos do array de maneira fácil e rápido, com pouquíssimo código.