Tôi tò mò muốn biết cách std:next_permutation
triển khai nên tôi đã trích xuất gnu libstdc++ 4.7
phiên bản và làm sạch các số nhận dạng và định dạng để tạo ra bản trình diễn sau ...
#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()));
}
Đầu ra như mong đợi: http://ideone.com/4nZdx
Câu hỏi của tôi là: Nó hoạt động như thế nào? Ý nghĩa của i
, j
và là k
gì? Giá trị nào họ giữ ở các phần khác nhau của quá trình thực hiện? Bản phác thảo của một bằng chứng về tính đúng đắn của nó là gì?
Rõ ràng trước khi vào vòng lặp chính, nó chỉ kiểm tra các trường hợp danh sách phần tử 0 hoặc 1 nhỏ. Tại mục nhập của vòng lặp chính, tôi đang trỏ đến phần tử cuối cùng (không phải một phần tử quá khứ) và danh sách dài ít nhất 2 phần tử.
Điều gì đang xảy ra trong phần nội dung của vòng lặp chính?