06.10
2020
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.