首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >next_permutation不是引用吗?

next_permutation不是引用吗?
EN

Stack Overflow用户
提问于 2020-06-04 12:04:31
回答 2查看 76关注 0票数 0

我不明白为什么在循环中,值的位置会发生变化。但是在do, while loop之外,所有的值都返回到原来的位置。因此,我需要//here代码。我也尝试了一个指针数组,但它显示了相同的行为。为什么会这样呢?

代码语言:javascript
复制
#include <iostream>
#include <algorithm>

using namespace std;

int main()
{
    int a[] = {0, 1, 2};
    do
    {
        for (int i = 0; i < 3; i++)
            cout << a[i];
        cout << endl;
    } while (next_permutation(a, a + 3));
    cout << endl;
    // here
    a[0] = 2;
    a[1] = 1;
    a[2] = 0;

    do
    {
        for (int i = 0; i < 3; i++)
            cout << a[i];
        cout << endl;
    } while (prev_permutation(a, a + 3));
    return 0;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-06-04 12:11:22

next_permutation就是这样定义的。最后一个排列(返回false的置换)是将元素按排序排列的排列。

我想还有另一个误会。在此:

代码语言:javascript
复制
do
{
    print_permutation();
} while (next_permutation(a, a + 3));

在循环中打印的最后一个排列是使next_permutation返回false的前一个置换。因此,在最后一次迭代中,您没有打印与循环外部相同的排列。它类似于:

代码语言:javascript
复制
bool increment(int& i) {
    ++i;
    return i<10;
}

int i = 0;
do {
   std::cout << i;
} while( increment(i) );

std::cout << i;

循环中打印的最后一个值是9,但循环后的i值是10

票数 1
EN

Stack Overflow用户

发布于 2020-06-04 12:13:04

每次调用它时,std::next_permutation都会生成给定容器a的置换P',其中当前置换是(比方说) P。只要它生成的置换P'大于P,它就返回true。但是,对于P是给定容器a中元素的最大置换(即,参见下面对伟大的解释)的情况,例如,P=[2, 1, 0]生成的下一个置换P'[0, 1, 2],它不大于P。在这种情况下,它返回false,循环终止。但是,由于进程的副作用,一旦函数返回,容器中的元素已经被放置在可能的最小排列中。这就是为什么在循环结束后,这些元素在最小排列中可能出现的原因。

“更大”这个词可能有点让人困惑。基本上,std::next_permutation使用任何可用的比较运算符来比较单个元素,并以一种随每一次排列而按字典顺序递增的方式迭代它们。因此,对于[0, 1, 2]的向量,它将按照该顺序迭代以下排列:

代码语言:javascript
复制
0, 1, 2
0, 2, 1
1, 0, 2
1, 2, 0
2, 0, 1
2, 1, 0

这就是为什么函数认识到[0,1,2]而不是作为[2,1,0]之后的一个更大的排列,并返回false。

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

https://stackoverflow.com/questions/62194152

复制
相关文章

相似问题

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