Como lo han señalado otros, consulte el enlace StackOverflow para obtener una explicación. Puede usar la función ‘NextPermutation’ para una implementación de C ++ 11. Desafortunadamente, no funciona para los iteradores para mantener el ejemplo simple. He asumido un vector genérico en su lugar.
#include #include #include usando el espacio de nombres estándar; plantilla bool NextPermutation (std :: vector & elems) { const int N = elems.size (); int li = -1; // Último índice para el cual elems [i + 1]> elems [i]. int next_candidate_index = li + 1; para (int i = 0; i <N; ++ i) { if ((i + 1 elems [i]) { li = i; next_candidate_index = li + 1; } if (li> = 0 && elems [i]> elems [li] && elems [i] <elems [next_candidate_index]) { next_candidate_index = i; } } si (li == -1) { falso retorno; } swap (elems [li], elems [next_candidate_index]); reverse (elems.begin () + li + 1, elems.end ()); volver verdadero; } plantilla vector <vector > GetPermutations (const vector & e) { permutaciones de vector <vector >; std :: vector elems (e); sort (elems.begin (), elems.end ()); hacer { permutations.emplace_back (elems); } while (NextPermutation (elems)); permutaciones de retorno; } int main () { std :: vector v {1, 2, 3, 4, 5}; permisos automáticos = GetPermutations (v); cout << perms.size () << endl; para (auto && p: perms) { cout << "{"; para (auto && i: p) { cout << i << ""; } cout << "} \ n"; } devuelve 0; }