Saya ingin tahu bagaimana std:next_permutationditerapkan, jadi saya mengekstrak gnu libstdc++ 4.7versinya dan membersihkan pengenal dan pemformatan untuk menghasilkan demo berikut ...
#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()));
}
Outputnya seperti yang diharapkan: http://ideone.com/4nZdx
Pertanyaan saya adalah: Bagaimana cara kerjanya? Apa artinya i, jdan k? Nilai apa yang mereka pegang di berbagai bagian eksekusi? Apa sketsa bukti kebenarannya?
Jelas sebelum memasuki loop utama itu hanya memeriksa kasus daftar elemen 0 atau 1 sepele. Pada entri loop utama, saya menunjuk ke elemen terakhir (bukan satu ujung terakhir) dan daftarnya setidaknya terdiri dari 2 elemen.
Apa yang terjadi di badan loop utama?