首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 怎么会出错?问题可能出在对迭代器的理解上,求牛人帮忙 [已结贴,结贴人:thinke365]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • thinke365
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 揭帖率:
    发表于:2008-08-21 01:11:52 楼主
    http://acm.zju.edu.cn/show_problem.php?pid=1319
    感觉下面实现没错啊,怎么输出的值就不对呢?

    C/C++ code
    #include <set> #include <vector> using namespace std; int const size = 30000; set<int> s; int put[size], get[size]; main() { int T, n, m; int i, j, k, t; scanf("%d", &T); while (T --) { scanf("%d%d", &n, &m); for (i = 0; i < n; i ++) { scanf("%d", &put[i]); } for (i = 0; i < m; i ++) { scanf("%d", &get[i]); } i = 0; k = 0; set<int>::iterator it = s.begin(); while (1) { for (t = 0; i < get[k]; t ++) { s.insert(put[i ++]); } it ++; printf("%d\n", *(it)); k ++; if(i == n) break; } } }



    我认为出错可能的原因在这里
    set <int>::iterator it = s.begin();

    while (1)
    {
    for (t = 0; i < get[k]; t ++)
    {
    s.insert(put[i ++]);
    }

    it ++;
    printf("%d\n", *(it));

    首先用一个迭代器指向 set容器的头部,在往set中插入数据之后, 递增迭代器,会指向下一个位置吗?
    20  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lzr4304061988012
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-21 01:28:411楼 得分:0
    会指向下一个位置?是什么意思?看我理解对没!
    C/C++ code
    set<int>::iterator it ; while (1) { for (t = 0; i < get[k]; t ++) { s.insert(put[i ++]); } it=s.begin(); it ++; printf("%d\n", *(it)); k ++; if(i == n) break; }


    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lzr4304061988012
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-21 01:33:212楼 得分:0
    还有个问题:
    for (t = 0; i < get[k]; t ++)
        {
                    s.insert(put[i ++]);
          }
    假如get[k]>n,put[i]岂不是越界了

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • budTang
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-22 02:59:163楼 得分:0
    整体来说,写得太乱了,看不出什么意图.
    C/C++ code
    i = 0; k = 0; for (t = 0; i < get[k]; t ++) { s.insert(put[i ++]); }

    这明显是无限循环嘛!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • taojian_hhu
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-22 09:15:274楼 得分:0
    两点问题
    1,如果get[k] <n,那么内层while循环为死循环
    2,s.insert插入元素的时候是在当前元素的前面插入元素,it++的话肯定越界了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • thinke365
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-24 13:44:595楼 得分:0
    引用 4 楼 taojian_hhu 的回复:
    两点问题
    1,如果get[k] <n,那么内层while循环为死循环
    2,s.insert插入元素的时候是在当前元素的前面插入元素,it++的话肯定越界了

    C/C++ code
    #include <set> #include <vector> using namespace std; int const size = 30000; set<int> s; int put[size], get[size]; main() { int T, n, m; int i, j, k, t; scanf("%d", &T); while (T --) { scanf("%d%d", &n, &m); for (i = 0; i < n; i ++) { scanf("%d", &put[i]); } for (i = 0; i < m; i ++) { scanf("%d", &get[i]); } i = 0; k = 0; set<int>::iterator it = s.begin(); while (1) { while(i < get[k]) { s.insert(put[i ++]); } it ++; printf("%d\n", *(it)); k ++; if(i == n) break; } } }

    程序运行可以理解如下:
    0)初始集合 S为空,有一个非空有穷集合  Z = {Z0, Z1, ..., Zn-1}, Zi ( i 为 0 .. n-1)为有穷自然数集合
    1) for i = 0 ... n-1
          将Zi元素插入S中,插入后,S中的元素为递增序列
          输出 S的第i个元素。
          i++;

    上面的实现应该没问题吧,怎么输出就是错误的呢?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lzr4304061988012
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-24 14:04:326楼 得分:0
    C/C++ code
    #include <set> #include <vector> using namespace std; int const size = 30000; set<int> s; int put[size], get[size]; void main() { int T, n, m; int i, j, k, t; scanf("%d", &T); while (T --) { scanf("%d%d", &n, &m); for (i = 0; i < n; i ++) { scanf("%d", &put[i]); } for (i = 0; i < m; i ++) { scanf("%d", &get[i]); } i = 0; k = 0; while (1) { while(i < get[k] && i<n) { s.insert(put[i ++]); } k ++; if(i == n || k==m) break; } } set<int>::iterator it = s.begin(); for(;it!=s.end();it++) printf("%d\n", *(it)); } 2 2 2 1 2 1 2 2 2 1 2 1 2 1 2 请按任意键继续. . .
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • thinke365
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-25 20:22:537楼 得分:0
    引用 6 楼 lzr4304061988012 的回复:
    C/C++ code
    #include <set>
    #include <vector>
    using namespace std;

    int const size = 30000;
    set <int> s;

    int put[size], get[size];

    void main()
    {
        int T, n, m;
        int i, j, k, t;
        scanf("%d", &T);
        while (T --)
        {
            scanf("%d%d", &n, &m);
            for (i = 0; i < n; i ++)
            {
                scanf("%d", &put[i]);
            }

            for (i = 0; i < m; i ++…

    你对题目的理解出错了。。。
    Z0 = 1 2 3  此时,输出第0各,为1  ,S为 1 2 3
    Z1 = -1      现在输出第1个还是 1  , S为 -1 1 2 3, 最后输出为 1 -1
    按你的意思输出为 -1 1
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • smilecnf
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-25 21:15:168楼 得分:3
    C/C++ code
    set<int> 返回的是pair类型
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • jinwei1984
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-26 00:47:329楼 得分:17
    插入后 迭代器失效了吧
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved