C ++:麻烦抓住std :: next_permutation和std :: prev_permutation工作

时间:2012-01-07 04:51:21

标签: 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;
}

向量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,即使它应该生成“较低的排列。”

另外,在上面显示的代码中,由于它使用了反向迭代器,我的大脑将其解释为找到12345677654321向后)的先前排列,在我看来应该没有。< / p>

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

根据定义,第一种排列在前向顺序中没有先前的排列。否则它不会是第一个。这就是为什么你需要rbegin得到反向迭代器的“第一”排列(这是最后一个排列)。