首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++:难以掌握std::next_permutation和std::prev_permutation工作

C++:难以掌握std::next_permutation和std::prev_permutation工作
EN

Stack Overflow用户
提问于 2012-01-07 04:51:21
回答 2查看 513关注 0票数 2

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

代码语言:javascript
复制
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

此代码工作

代码语言:javascript
复制
do {
...
}
while (std::prev_permutation(number.rbegin(), number.rend()));

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

另外,在上面所示的代码中,由于它使用了反向迭代器,我的思维将它解释为找到了1234567 (7654321向后)的前一个排列,在我看来,这个置换应该没有。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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,则需要修复初始化例程。

票数 2
EN

Stack Overflow用户

发布于 2012-01-07 05:02:50

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8767458

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档