C++ C++;:难以掌握std::next_置换和std::prev_置换工作

C++ C++;:难以掌握std::next_置换和std::prev_置换工作,c++,algorithm,stl,permutation,C++,Algorithm,Stl,Permutation,编辑:对不起,这只是我在下面的代码中初始化的错误 const int kDigits = 7; std::vector<int> number(kDigits); for (int i = kDigits - 1; i >= 0; i--) { number[i] = i + 1; } 然而,我不明白为什么。既然7654321是最大的词典排列,就不应该while(std::prev_排列(number.begin(),number.end())(没有反向迭代器)正确地

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

const int kDigits = 7;
std::vector<int> number(kDigits);
for (int i = kDigits - 1; i >= 0; i--) {
    number[i] = i + 1;
}
然而,我不明白为什么。既然
7654321
是最大的词典排列,就不应该
while(std::prev_排列(number.begin(),number.end())(没有反向迭代器)正确地生成它,因为它会按顺序生成前一个排列?然而,在第一次尝试时返回false,即使它应该生成“较低排列”

此外,在上面显示的代码中,由于它使用反向迭代器,我的思维将其解释为查找以前的
1234567
7654321
向后)排列,在我看来,它应该没有


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

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

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


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

Hmm,但7654321不是被视为最后一个置换,因此不会有下一个置换,但会有上一个置换吗?例如,这里的示例代码:显示的输出与我预期的完全相同——321312231213该代码不像您的代码那样向构造函数传递迭代器。我不确定你认为你的代码和他们的代码有什么相似之处。您以正常顺序获取第一个条目(通过
begin
),然后尝试查找前一个条目(通过
prev_permutation
),该条目无法工作。它们根本不这样做,而是将一个范围传递给构造函数,而不是迭代器。
do {
...
}
while (std::prev_permutation(number.rbegin(), number.rend()));