编辑:对不起,这正是我在下面的代码中初始化的错误。
const int kDigits = 7;
std::vector<int> number(kDigits);
for (int i = kDigits - 1; i >= 0; i--) {
number[i] = i + 1;
}向量number初始化为7, 6, 5, 4, 3, 2, 1。
我的目标是按递减顺序生成排列: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向后)的前一个排列,在我看来,这个置换应该没有。
非常感谢您提前提供帮助!我期待着弄清楚我误解了什么/我错过了什么。
发布于 2012-01-07 05:16:27
向量number被初始化为1,2,3,4,5,6,7,而不是7,6,5,4,3,2,1。这就是为什么你的代码有效。
如果要将其初始化为7,6,5,4,3,2,1,则需要修复初始化例程。
发布于 2012-01-07 05:02:50
根据定义,第一个置换没有先前的前向排列。否则就不会是第一名了。这就是为什么您需要rbegin来获得反向迭代器的“第一个”置换(这是最后的置换)。
https://stackoverflow.com/questions/8767458
复制相似问题