next_permutation
будет проходить через все перестановки, а не только через большие перестановки. Нет необходимости возвращать и использовать prev_permutation
, и, конечно, не нужно сортировать.
Вам нужно только позаботиться о том, чтобы next_permutation
вернул false
, как только он "перевернется" в лексикографически низкую перестановку, поэтому вам нужно отслеживать количество текущей перестановки, чтобы знать, когда остановиться.
То есть следующее будет перебирать все возможные перестановки диапазона, независимо от того, как выглядит начальный диапазон.
size_t const num_permutations = multinomial_coefficient(range);
for (size_t i = 0; i < num_permutations; ++i) {
next_permutation(range.begin(), range.end());
// use permutation.
}
Где multinomial_coefficient
- это множитель от числа различных элементов в диапазоне. В простом случае, когда все элементы различны, это эквивалентно N !, факториал числа элементов.