मैं उत्सुक था कि कैसे std:next_permutationलागू किया गया था इसलिए मैंने gnu libstdc++ 4.7संस्करण निकाला और पहचानकर्ताओं को संचित किया और निम्नलिखित डेमो का निर्माण करने के लिए प्रारूपण किया ...
#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()));
}
आउटपुट अपेक्षित है: http://ideone.com/4nZdx
मेरे सवाल हैं: यह कैसे काम करता है? का अर्थ क्या है i, jऔर k? निष्पादन के विभिन्न भागों में उनका क्या मूल्य है? इसकी शुद्धता के प्रमाण का एक रेखाचित्र क्या है?
मुख्य लूप में प्रवेश करने से पहले यह केवल तुच्छ 0 या 1 तत्व सूची मामलों की जाँच करता है। मुख्य लूप के प्रवेश पर मैं अंतिम तत्व (एक अंतिम छोर नहीं) की ओर इशारा कर रहा हूं और सूची कम से कम 2 तत्वों की लंबी है।
मुख्य लूप के शरीर में क्या चल रहा है?