编辑:对不起,原来我的错误是在下面的代码中初始化。
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
向后)的先前排列,在我看来应该没有。< / p>
非常感谢您的帮助!我期待弄清楚我误解了什么/我错过了什么。
答案 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
得到反向迭代器的“第一”排列(这是最后一个排列)。