首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++ <algorithm>置换

C++ <algorithm>置换
EN

Stack Overflow用户
提问于 2010-06-29 14:56:33
回答 3查看 1.7K关注 0票数 2

为什么这个代码注释是工作的(代码编译和运行良好,但实际上并没有显示排列):

代码语言:javascript
复制
int main(int argc, char *argv[])
{
    long number;
    vector<long> interval;
    vector<long>::const_iterator it;

    cout << "Enter number: ";
    cin >> number;

    while(number-->0){
        interval.push_back(number);
    }

    do{
        for(it = interval.begin(); it < interval.end(); ++it){
            cout << *it << " ";
        }
        cout << endl;
    } while(next_permutation(interval.begin(), interval.end()));

    return (0);
}

但是在改变了这一行之后:

代码语言:javascript
复制
while(next_permutation(interval.begin(), interval.end()));

通过以下方式:

代码语言:javascript
复制
while(prev_permutation(interval.begin(), interval.end()));

置换不是通过对位置的作用来改变向量中的元素吗?

PS:我现在已经编辑了代码.

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-06-29 15:09:43

排列是按顺序排列的,这就是std::next_permutationstd::prev_permutation算法所遍历的。

在这里,您输入“最大”排列,因此没有下一个排列顺序。

票数 7
EN

Stack Overflow用户

发布于 2010-06-29 15:15:53

不是通过对位置的作用来改变向量中的元素吗?

不是的。next_permutation使用元素的排序来确定下一个排列。

例如,如果Anext_permutation of A,B,C将是A,C,B。但是,如果Anext_permutation of A,B,C将是C,A,B

因为你的向量最初是按递减顺序排列的,所以它将是最后的排列。

您可以使用std::greater排序来反转比较方向。

代码语言:javascript
复制
} while(next_permutation(interval.begin(), interval.end(), greater<long>()));
//                                                         ^^^^^^^^^^^^^^^
票数 3
EN

Stack Overflow用户

发布于 2010-06-29 15:10:09

我不认为next_permutation可以在位置上工作(它将把这些信息存储在哪里?)您需要能够比较元素才能使next_permutation工作,这就是它用来生成按字母顺序排列的下一个排列。

试着用相反的顺序插入数字,看看是否有效。

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

https://stackoverflow.com/questions/3141907

复制
相关文章

相似问题

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