用next_permutation()生成r-组合数,兼发现VC7的一个bug

原创 2002年10月21日 09:10:00

    C++ standard library提供了两个生成排列的algorithms:next_permutation()与prev_permutation(),却没有提供生成组合数的标准函数。

    由于排列与组合之间有着密切的联系,我们很容易就可以从“排列”获得“组合”。从n个元素中任取r个元素的组合,有n! / (r! * (n-r)!)个。这些组合可用多重集{r·1, (n-r)·0}的全排列来生成,请看示例程序:

#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;

int main()
{

    // 从n个元素中,任取r个元素的所有组合:
    //  G++[o] BCC5[o] VC7[x]

    const int n = 7;
    const int r = 4; // 0 <= r <= n
    vector<int> p, set;
    p.insert(p.end(), r, 1);
    p.insert(p.end(), n - r, 0);
   
    for ( int i = 0; i != p.size(); ++i )
        set.push_back(i+1);
   
    int count = 0;
    do {
        for ( int i = 0; i != p.size(); ++i )
            if(p[i])
                cout << set[i] << " ";
        count++;
        cout << "/n";
    } while (prev_permutation( p.begin(), p.end() ));
   
    cout << "There are " << count << " combinations in total.";
}

以上程序在G++ 3.2、BCC 5.5.1、VC7下编译通过,但在VC7版运行发生死循环。怀疑这是VC7的bug, 于是再用以下程序验证之:

#include <algorithm>
#include <vector>
#include <iostream>
#include <iterator>

using namespace std;

int main()
{
    // 经VC7编译执行后,会死循环,不可思议!
    // BCC5[o] G++[o] VC7[x]
    vector<int> p;
   
    p.push_back(2);
    p.push_back(2);
    p.push_back(1);

    do {
        copy(p.begin(), p.end(), ostream_iterator<int>(cout, " "));
        cout << "/n";
    } while (prev_permutation(p.begin(), p.end()));
}

依旧是VC7版发生死循环,看来这真的是vc7中prev_permutation()的一个bug。我向http://www.dinkumware.com/提交了一份bug report,得到的回复是:

Our documentation points out, for both prev_permutation and
next_permutation that no two elements may have equivalent
ordering.

P.J. Plauger

经查,http://www.dinkumware.com/的文档中确实有这样的说法。而在MSDN中,我没有找到类似的提法,恐怕只能解释为MS的文档的更新太慢了。

如何写出一个让人很难发现的bug?

点击上方“程序人生”,选择“置顶公众号” 第一时间关注程序猿(媛)身边的故事 程序员的日常三件事:写bug、改bug、背锅。连程序员都自我调侃道,为什么每天都在加班?因为我...
  • csdnsevenn
  • csdnsevenn
  • 2018年01月29日 00:00
  • 2688

next_permutation(排列组合)函数的用法

关于该函数的用法,不妨先看下这道题 题目描述  一天ZJ看到小明竟然排序学的比自己还牛,于是就出了一道题来难为小明,来证明自己排序学的比小明更牛。题目就是有一个数n(0,,,聪明的你能帮小...
  • FK103
  • FK103
  • 2015年04月11日 10:18
  • 1329

软件测试-如何快速发现Bug

在高强度的测试工作中,如何快速、有效、准确的开展测试工作,总结。
  • aliuxina
  • aliuxina
  • 2017年02月15日 11:37
  • 1531

一个bug的成本

我想说的当然不是一个bug价值多少钱,因为软件行业因行业不同,公司不同,业务不同,你的软件价值也不同;其实bug用价值来形容当然不合适,更应该用损失或者公司的支出来形容了。         写出本文...
  • xingyu_qie
  • xingyu_qie
  • 2016年03月15日 10:44
  • 1114

全排列生成算法:next_permutation

概念 全排列的生成算法有很多种,有递归遍例,也有循环移位法等等。C++/STL中定义的next_permutation和prev_permutation函数则是非常灵活且高效的一种方法,它被广泛...
  • jeasn168
  • jeasn168
  • 2014年09月04日 08:56
  • 7954

STL之next_permutation函数对各种类型的全排列实例

最近学了个next_permutation函数,但学习的还不是很透彻,这里转载一篇博文详解next_permutation函数对各种变量类型的全排列。(转载地址:点击打开链接)   若需要了解ne...
  • zwj1452267376
  • zwj1452267376
  • 2015年07月02日 18:17
  • 1175

一个软件,你测试了一个月都没有发现bug,这说明什么?你怎么办?

给你一个软件,你测试了一个月都没有发现bug,这说明什么?你怎么办? 看到这个题目,一时之间真不知道如何回答,因为的确没有遇到过这样的情况。我的看法是: 1.说明软件已经没有bug了.严格...
  • saroan
  • saroan
  • 2017年10月28日 22:45
  • 308

C++STL的next_permutation 的用法

转自:http://zhangjian110518.blog.163.com/blog/static/74991703200862532221516/    这是一个求一个排序的下一个排列的函数。如...
  • wconvey
  • wconvey
  • 2012年04月13日 20:04
  • 3554

组合的生成算法

 本组合生成算法采用非递归生成方法,效率比较高。/** * 组合的生成算法 * 实现枚举出组合C(n,r) */package source;/** * @author lgj * @time 200...
  • lgjfly
  • lgjfly
  • 2009年10月07日 16:54
  • 680

各阶段修改BUG所需成本

PONC是Price of Nonconformance的缩写,是指由于没有第一次做对或做错事而造成人财物的额外浪费。简称:质量成本。质量成本在软件工程里可衡量缺陷代价,如果后期项目出质量问题,后期投...
  • Jerry_1126
  • Jerry_1126
  • 2017年08月28日 22:41
  • 479
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用next_permutation()生成r-组合数,兼发现VC7的一个bug
举报原因:
原因补充:

(最多只允许输入30个字)