C++:无法掌握std::next_permination和std::prev_permutation的工作

C++: Trouble grasping std::next_permutation and std::prev_permutation work

本文关键字:std prev 工作 permutation next 掌握 C++ permination      更新时间:2023-10-16

EDIT:对不起,这只是我在下面代码中初始化时的错误。

const int kDigits = 7;
std::vector<int> number(kDigits);
for (int i = kDigits - 1; i >= 0; i--) {
    number[i] = i + 1;
}

向量CCD_ 1被初始化为CCD_
我的目标是按递减顺序生成排列:7654321 7654312 7654231 7654213 7654132

此代码有效:

do {
...
}
while (std::prev_permutation(number.rbegin(), number.rend()));

然而,我不明白为什么。既然7654321是最大的字典排列,那么while (std::prev_permutation(number.begin(), number.end()));(没有反向迭代器)不应该正确地生成它吗?因为它会按顺序生成前一个排列吗?然而,这在第一次尝试时返回false,即使它应该生成"较低排列"

此外,在上面显示的代码中,由于它使用了反向迭代器,我的大脑将其解释为找到1234567的前一个排列(7654321向后),在我看来,它应该没有。

非常感谢您提前提供的帮助!我期待着弄清楚我误解了什么/错过了什么。

向量number初始化为1,2,3,4,5,6,7,而不是number0。这就是您的代码工作的原因。

如果要将其初始化为7,6,5,4,3,2,1,则需要修复初始化例程。

根据定义,第一个排列没有前向排列。否则就不会是第一了。这就是为什么您需要rbegin来获得反向迭代器的"第一个"排列(这是最后一个排列)。