Ero curioso di sapere come std:next_permutationfosse implementato così ho estratto la gnu libstdc++ 4.7versione e disinfettato gli identificatori e la formattazione per produrre la seguente demo ...
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
template<typename It>
bool next_permutation(It begin, It end)
{
if (begin == end)
return false;
It i = begin;
++i;
if (i == end)
return false;
i = end;
--i;
while (true)
{
It j = i;
--i;
if (*i < *j)
{
It k = end;
while (!(*i < *--k))
/* pass */;
iter_swap(i, k);
reverse(j, end);
return true;
}
if (i == begin)
{
reverse(begin, end);
return false;
}
}
}
int main()
{
vector<int> v = { 1, 2, 3, 4 };
do
{
for (int i = 0; i < 4; i++)
{
cout << v[i] << " ";
}
cout << endl;
}
while (::next_permutation(v.begin(), v.end()));
}
L'output è come previsto: http://ideone.com/4nZdx
Le mie domande sono: come funziona? Qual è il significato di i, je k? Che valore hanno nelle diverse parti dell'esecuzione? Che cos'è uno schizzo di una prova della sua correttezza?
Chiaramente prima di entrare nel ciclo principale, controlla solo i casi banali dell'elenco di elementi 0 o 1. All'ingresso del ciclo principale i punta all'ultimo elemento (non una fine passata) e l'elenco è lungo almeno 2 elementi.
Cosa sta succedendo nel corpo del ciclo principale?