আমি কৌতূহল ছিল কীভাবে কীভাবে 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 টি উপাদান দীর্ঘ।
মূল লুপের শরীরে কী চলছে?