STL不是每时每刻都“靠得住”的

yzx714 2011-01-29 02:19:29
首先我这是BTD啊,STL是很不错的,我想在本帖说的,是另一个可能你也觉得比较有趣的问题。
传说有一道很Boring的题目:
Description

  集合的前N个元素:编一个程序,按递增次序生成集合M的最小的N个数,M的定义如下:
(1)数1属于M;
(2)如果X属于M,则Y=2*X+1和Z=3*x+1也属于M;
(3)此外再没有别的数属于M。

Input

n(b.in) (1≤n≤100)

Output

生成集合M的最小的N个数(b.out)


看到集合问题,本人就马上用set了,代码如下:
#include <set>
#include <algorithm>
#include <iostream>
#include <iterator>
using namespace std;
int main()
{
set<int> s;
int n,i;
cin>>n;
s.insert(1);
int p1,p2;
set<int>::iterator ite=s.begin();
for(i=1; i<=n; i+=2){
s.insert( 2 * (*ite) + 1);
s.insert( 3 * (*ite) + 1);
ite++;
}
for( i=1, ite = s.begin(); ite!=s.end() && i <= n; ite++, i++){
cout<<*ite<<' ';
}
cout<<endl;
return 0;
}

自认为很完美,提交结果是Wrong Answer。艹,大骂评测系统,竟敢怀疑STL的正确性!于是要来童鞋过了的代码,如下:
#include <iostream>
using namespace std;

int a[1000]={0}, b[1000]={0}, head_a = 1, head_b = 1, rear = 1, x = 1, n;

int main() {

cin >> n;
for (int i = 1; i <= n; i++) {
cout << x << " ";
a[rear] = 2 * x + 1;
b[rear] = 3 * x + 1;
// cout << a[rear] << " " << b[rear] << " " << rear << endl;
rear++;
if (a[head_a] > b[head_b]) x = b[head_b], head_b++;
else if (a[head_a] < b[head_b]) x = a[head_a], head_a++;
else if (a[head_a] == b[head_b]) {
x = a[head_a];
head_a++;
head_b++;
}
}
return 0;

}


输入100, 结果我用STL写的得到:
1 3 4 7 9 10 13 15 19 21 22 27 28 31 39 40 43 45 46 55 57 58 63 64 67 79 81 82 85 87 91 93 94 111 115 117 118 121 127 129 130 135 136 139 159 163 165 166 171 172 175 183 187 189 190 193 202 223 231 235 237 238 243 244 247 255 256 259 261 262 271 273 274 279 280 283 319 327 331 333 334 343 345 346 352 355 364 382 388 391 406 409 418 478 490 496 499 514 517
还是输入100,童鞋的代码得到:
1 3 4 7 9 10 13 15 19 21 22 27 28 31 39 40 43 45 46 55 57 58 63 64 67 79 81 82 85 87 91 93 94 111 115 117 118 121 127 129 130 135 136 139 159 163 165 166 171 172 175 183 187 189 190 193 202 223 231 235 237 238 243 244 247 255 256 259 261 262 271 273 274 279 280 283 319 327 331 333 334 343 345 346 351 352 355 364 367 375 379 381 382 387 388 391 405 406 409 418

发现前面都是很相似的,但在352的地方突然变化了~
你能发现这个错误吗~
...全文
238 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
YT158828 2011-01-29
  • 打赏
  • 举报
回复
STL还是比较靠谱的..
taodm 2011-01-29
  • 打赏
  • 举报
回复
qq120848369应该现在对楼主犯的类似问题刻骨铭心之警惕的了。
犯的错多了,就成为高手了。
qq120848369 2011-01-29
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 hiroyukki 的回复:]

每天回帖即可获得10分可用分!小技巧:教您如何更快获得可用分
[/Quote]

那里肯定是有问题的,我刚看代码就看出来了,忘说了。

一个树结构set里,做任何操作,迭代器所指结点的位置可能已经发生了改变,必须接受insert返回值,它指向了插入结点的后继,这在平衡二叉树(红黑树)里支持的非常好的。
iambic 2011-01-29
  • 打赏
  • 举报
回复
尽量避免在中文里夹英文(术语除外)。用中文表达问题的能力,和用编程语言解决问题的能力,是息息相关的。
cwbcwb505 2011-01-29
  • 打赏
  • 举报
回复
我有一个疑问,那就是你往里面插入数据,iter会不会变得无效呢?如果是因为iter变得无效而出现这位的问题的话,那就不是人家stl的错了。由于基础知识学得不够扎实,所以不敢肯定
贪食蛇男 2011-01-29
  • 打赏
  • 举报
回复
每天回帖即可获得10分可用分!小技巧:教您如何更快获得可用分
Unix10 2011-01-29
  • 打赏
  • 举报
回复
STL还是很值得信任的,先不信任自己一下吧。
qq120848369 2011-01-29
  • 打赏
  • 举报
回复
是这样做么,要我做肯定用的是队列Q+set。

初始化:Q.push(1)

循环不变式:x=Q.pop(),set.push(x);Q.push(2*x+1),Q.push(3*x+1);
纸箱猪 2011-01-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 xz0404 的回复:]

STL 没LZ 想的那么不严谨。
虽然我没用过 但是看一看就知道
for(i=1; i<=n; i+=2){
少循环了1半。
[/Quote]

果然是!我还真没注意到少循环了一半。
纸箱猪 2011-01-29
  • 打赏
  • 举报
回复
也许不应该用set,而应该用vector之类的有序数据结构,并且用push_back之类的方法将新元素插入到数据结构的尾部。对于楼主的程序来说,问题应该就出在第一个for循环中,因为当前向set插入的新元素可能会插入到当前迭代器所指向的元素之前,这样以后就会漏掉这个新元素。这就是为什么楼主的输出中没有351——楼主程序的第一个for循环没有遍历175这个数,仅仅是将它插入了而已。

我想楼主也许是想告诉大家:使用STL时不要想当然,是吗?
「已注销」 2011-01-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 yzx714 的回复:]

引用 1 楼 xz0404 的回复:

STL 没LZ 想的那么不严谨。
虽然我没用过 但是看一看就知道
for(i=1; i<=n; i+=2){
少循环了1半。
额,我实际上想说的就是这个思维误区……现在看我这个贴简直比这道题还boring,干脆直接改为散分吧
[/Quote]
我还没看明白,我是来接分的。
yzx714 2011-01-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 xz0404 的回复:]

STL 没LZ 想的那么不严谨。
虽然我没用过 但是看一看就知道
for(i=1; i<=n; i+=2){
少循环了1半。
[/Quote]额,我实际上想说的就是这个思维误区……现在看我这个贴简直比这道题还boring,干脆直接改为散分吧
xz0404 2011-01-29
  • 打赏
  • 举报
回复
STL 没LZ 想的那么不严谨。
虽然我没用过 但是看一看就知道
for(i=1; i<=n; i+=2){
少循环了1半。

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧