【问题标题】:C++: Trouble grasping std::next_permutation and std::prev_permutation workC++:难以掌握 std::next_permutation 和 std::prev_permutation 工作
【发布时间】:2012-01-07 04:51:21
【问题描述】:

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

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()));(没有反向迭代器)是否应该正确生成它,因为它会按顺序生成 previous 排列?但是,这在第一次尝试时返回 false,即使它应该生成“较低的排列”。

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

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

【问题讨论】:

    标签: c++ algorithm stl permutation


    【解决方案1】:

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

    如果你希望它初始化为7,6,5,4,3,2,1,你需要修复初始化例程。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 嗯,但 7654321 不被认为是最后一个排列,所以不会有下一个排列,但会有前一个排列?例如,这里的示例代码:cplusplus.com/reference/algorithm/prev_permutation 显示的输出完全符合我的预期——321、312、231、213
      • 该代码没有像您的那样将迭代器传递给构造函数。我不确定你认为你的代码和他们的代码有什么相似之处。您按正常顺序获取第一个条目(通过begin),然后尝试找到前一个条目(通过prev_permutation,这是行不通的。他们根本不这样做,他们将范围传递给构造函数,而不是迭代器。
      猜你喜欢
      • 1970-01-01
      • 2022-01-26
      • 2022-10-23
      • 1970-01-01
      • 2011-12-29
      • 2012-07-14
      • 1970-01-01
      • 2015-08-11
      • 2011-06-25
      相关资源
      最近更新 更多