搜索关于 STL 中排列 permutation 的时候,发现一个说到 VC 的实现的 bug 的网页,“
用next_permutation()生成r-组合数,兼发现VC7的一个bug”(http://blog.csdn.net/Solstice/archive/2002/10/21/2059.aspx)。没想到这个情况也被我碰到了。
我是在用 permutation 实现顺序敏感的组合 order_combination 时碰到的。VC 2003 sp1 中,对存在相同元素的序列 [6, 5, 4, 1, 1, 3] 调用 prev_permutation,得到的结果是
[6, 5, 4, 1, 3, 1],而正确的结果应该是
[6, 5, 3, 4, 1, 1]。
同样的代码在 Dev-C++ 4.9.9.2 中测试则不会出现问题。所以是 VC 2003 sp1 的 bug 无疑了。
解决办法:将 include 目录下的 algorithm 文件中 prev_permutation 非谓词版本的
if (!(*--_Next < *_Next1))
|
替换为:
将 prev_permutation 的谓词版本的
if (!_Pred(*--_Next, *_Next1))
|
替换为:
if (_Pred(*_Next1, *--_Next))
|
其实都是把两个比较的两个元素的顺序调换,再去掉 ! 逻辑非运算符;也就是“不小于”变成“大于”。
阅读(1417) | 评论(0) | 转发(0) |