📜  C++中的std :: next_permutation和prev_permutation(1)

📅  最后修改于: 2023-12-03 14:59:50.799000             🧑  作者: Mango

C++中的std::next_permutation和std::prev_permutation

在C++中,可以使用STL中的std::next_permutationstd::prev_permutation函数来生成序列的下一个或上一个排列。这两个函数分别以字典序为顺序生成排列,因此必须先将序列排序,才能使用这两个函数。

std::next_permutation

std::next_permutation函数用于生成序列的下一个排列,其语法为:

template<typename BidirectionalIterator>
bool next_permutation(BidirectionalIterator first, BidirectionalIterator last);

其中firstlast是迭代器,表示要生成排列的序列。函数将该序列转换为其下一个排列,如果生成了下一个排列,则返回true,否则返回false

以下示例演示了如何使用std::next_permutation函数生成向量的下一个排列:

#include <iostream>
#include <algorithm>
#include <vector>

int main()
{
    std::vector<int> v{ 1, 2, 3, 4 };
    
    do {
        for (int i : v) {
            std::cout << i << ' ';
        }
        std::cout << '\n';
    } while (std::next_permutation(v.begin(), v.end()));
    
    return 0;
}

运行以上代码,输出如下:

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
std::prev_permutation

std::prev_permutation函数用于生成序列的上一个排列,其语法为:

template<typename BidirectionalIterator>
bool prev_permutation(BidirectionalIterator first, BidirectionalIterator last);

std::next_permutation类似,firstlast是迭代器,表示要生成排列的序列。函数将该序列转换为其上一个排列,如果生成了上一个排列,则返回true,否则返回false

以下示例演示了如何使用std::prev_permutation函数生成向量的上一个排列:

#include <iostream>
#include <algorithm>
#include <vector>

int main()
{
    std::vector<int> v{ 4, 3, 2, 1 };
    
    do {
        for (int i : v) {
            std::cout << i << ' ';
        }
        std::cout << '\n';
    } while (std::prev_permutation(v.begin(), v.end()));
    
    return 0;
}

运行以上代码,输出如下:

4 3 2 1
4 3 1 2
4 2 3 1
4 2 1 3
4 1 3 2
4 1 2 3
3 4 2 1
3 4 1 2
3 2 4 1
3 2 1 4
3 1 4 2
3 1 2 4
2 4 3 1
2 4 1 3
2 3 4 1
2 3 1 4
2 1 4 3
2 1 3 4
1 4 3 2
1 4 2 3
1 3 4 2
1 3 2 4
1 2 4 3
1 2 3 4

这两个函数可以在许多排列问题中使用,例如排列组合问题、密码破解等。需要注意的是,当输入序列中存在相同的元素时,这两个函数生成的排列是不同的。