C++ 算法 next_permutation() 函數用於將範圍 [first, last) 中的元素重新排序為下一個字典序更大的排列。
排列被指定為可以對一組或多個事物進行排序或排列的幾種可能方式中的每一種。它表示為N!其中 N = 範圍內的元素數。
對於第一個版本使用運算符 < 比較元素,或者對於第二個版本使用給定的二進製比較函數 comp 比較元素。
用法
default (1) template <class BidirectionalIterator>
bool next_permutation (BidirectionalIterator first, BidirectionalIterator last);
custom (2) template <class BidirectionalIterator, class Compare>
bool next_permutation (BidirectionalIterator first, BidirectionalIterator last,
Compare comp);
參數
first: 一個雙向迭代器,指向要排列的範圍內的第一個元素。
last:一個輸入迭代器,指向要排列的範圍中最後一個位置。
comp: 一個用戶定義的二元謂詞函數,它接受兩個參數,如果兩個參數按順序返回真,否則返回假。它遵循嚴格的弱排序來對元素進行排序。
返回值
如果函數可以將對象重新排序為字典序更大的排列,則返回 true。
否則,該函數返回 false 以指示排列不大於先前的排列,而是可能的最低排列(按升序排序)。
複雜度
複雜性在第一個和最後一個之間的距離的一半內達到線性。
數據競爭
範圍 [first, last) 中的對象被修改。
異常
如果任一元素被交換或迭代器上的操作引發異常,則此函數將引發異常。
注意:無效的參數會導致未定義的行為。
例子1
讓我們看一個簡單的例子來演示 next_permutation() 的使用:
#include <algorithm>
#include <string>
#include <iostream>
using namespace std;
int main()
{
string s = "aba";
sort(s.begin(), s.end());
do {
cout << s << '\n';
} while(next_permutation(s.begin(), s.end()));
return 0;
}
輸出:
aab aba baa
例子2
讓我們看另一個簡單的例子:
#include <iostream> // std::cout
#include <algorithm> // std::next_permutation, std::sort
using namespace std;
int main () {
int myints[] = {1,2,3};
sort (myints,myints+3);
cout << "The 3! possible permutations with 3 elements:\n";
do {
cout << myints[0] << ' ' << myints[1] << ' ' << myints[2] << '\n';
} while ( next_permutation(myints,myints+3) );
cout << "After loop:" << myints[0] << ' ' << myints[1] << ' ' << myints[2] << '\n';
return 0;
}
輸出:
The 3! possible permutations with 3 elements: 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 After loop:1 2 3
例子3
讓我們看另一個簡單的例子:
#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()));
}
輸出:
1 2 3 4 1 2 4 3 1 3 2 4 1 3 4 2 1 4 2 3 1 4 3 2 2 1 3 4 2 1 4 3 2 3 1 4 2 3 4 1 2 4 1 3 2 4 3 1 3 1 2 4 3 1 4 2 3 2 1 4 3 2 4 1 3 4 1 2 3 4 2 1 4 1 2 3 4 1 3 2 4 2 1 3 4 2 3 1 4 3 1 2 4 3 2 1
示例 4
讓我們看一個簡單的例子:
#include <iostream>
#include <algorithm>
using namespace std;
// Program to find all lexicographically next permutations
int main()
{
string s = "231";
// Optional:sort the string in natural order before calling
// std::next_permutation inside a loop to print all permutations,
// not just the ones that follows specified string lexicographically
// std::sort(begin(s), end(s));
// find all lexicographically next permutations using
// std::next_permutation
while (1)
{
// print current permutation
cout << s << " ";
// find next permutation in lexicographic order
if (!next_permutation(begin(s), end(s)))
break;
}
return 0;
}
輸出:
231 312 321
相關用法
- C++ Algorithm nth_element()用法及代碼示例
- C++ Algorithm remove_if()用法及代碼示例
- C++ Algorithm remove()用法及代碼示例
- C++ Algorithm max_element()用法及代碼示例
- C++ Algorithm set_union()用法及代碼示例
- C++ Algorithm upper_bound()用法及代碼示例
- C++ Algorithm minmax()用法及代碼示例
- C++ Algorithm remove_copy_if()用法及代碼示例
- C++ Algorithm random_shuffle()用法及代碼示例
- C++ Algorithm pop_heap()用法及代碼示例
- C++ Algorithm replace()用法及代碼示例
- C++ Algorithm set_intersection()用法及代碼示例
- C++ Algorithm lower_bound()用法及代碼示例
- C++ Algorithm transform()用法及代碼示例
- C++ Algorithm set_difference()用法及代碼示例
- C++ Algorithm is_sorted()用法及代碼示例
- C++ Algorithm equal_range()用法及代碼示例
- C++ Algorithm minmax_element()用法及代碼示例
- C++ Algorithm stable_sort()用法及代碼示例
- C++ Algorithm min()用法及代碼示例
注:本文由純淨天空篩選整理自 C++ Algorithm next_permutation ()。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。