首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 一个STL面试问题,不解! [已结帖,结帖人:zmzbs123]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zmzbs123
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 结帖率:
    发表于:2008-05-16 13:52:38 楼主
    vector <int> array;
    array.push_back( 1 );
    array.push_back( 2 );
    array.push_back( 3 );
    for( vector <int>::size_type i=array.size()-1; i>=0; --i ) // 反向遍历array数组
    {
    cout < < array[i] < < endl;
    }
    当我运行代码的时候,没有输出 3 2 1,而是输出了一大堆很大的数字,为什么?
    于是我修改了代码
    for(vector <int>::size_type j=array.size();j>0;j--)
    {
        cout < < "element is " < <array[j-1] < <endl;
        }
    这样就输出了 3 2 1,倒是为什么呢?
    20  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • oo
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-16 13:56:041楼 得分:1
    vector <int>::size_type 是unsigned的?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zmzbs123
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-16 14:00:522楼 得分:0
    不知道啊
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • dahua010
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-16 14:01:333楼 得分:1
    vector <int>::size_type i
    你的i 只能是正整形. 也就是说,当i是0的时候 --i 自然会是一个很大的数.

    而你后来的程序j>0;j--, 这样的话在j == 0 的时候就循环退出了. 所以可以正确输出
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • WingForce
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-16 14:01:414楼 得分:1
    因为

    C/C++ code
    class vector { //... typedef size_t size_type; }; typedef unsigned int size_t;
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • clhposs
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-16 14:02:105楼 得分:1
    --i ;最后他不是unsigned了  但是因为他是size_t 所以出现错误
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • clhposs
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-16 14:03:086楼 得分:0
    最后一次 --i

    0  然后自减  size_t 不能是负数 所以出错
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xkyx_cn
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 2

    发表于:2008-05-16 14:06:387楼 得分:1
    i 的类型是size_type, 那么i>=0永远成立
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • biosli
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-16 14:10:238楼 得分:1
    首先,for循环里遍历数组建议要用iterator...如果你用别的数据结构比如list,内存是不连续的,到时候代码修改量会很大~~
    而且,STL当时设计的时候iterator,是贯穿始终的,一定要好好利用。
    C/C++ code
    for(vector<int>::iterator iter = array.begin(); iter != array.end(); ++iter) cout<<"element is"<<(*iter)<<endl;

    其次,你这里的j是从array.size()得来的,循环递减,所以输出的会是321。不明白就单步执行看看j-1的值是啥。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • guolihui112
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-16 14:14:049楼 得分:1
    引用楼主 zmzbs123 的帖子:
    vector <int> array;
    array.push_back( 1 );
    array.push_back( 2 );
    array.push_back( 3 );
    for( vector <int>::size_type i=array.size()-1; i>=0; --i ) // 反向遍历array数组
    {
    cout  < < array[i]  < < endl;
    }


    第一遍循环: i = 2, 输出array[2],即3
    第二遍循环:  i = 1,  输出array[1],  2
    第三遍循环:  i = 0, 输出array[0],  1

    在第三遍循环出来时候 --i使得i变成-1,一个很大的数,就陷入循环了

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • liyinlei
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-16 14:15:4510楼 得分:1
    for( vector <int>::size_type i=array.size()-1; i>=0; --i ) // 反向遍历array数组

    修改为:

    for( vector <int>::size_type i=array.size()-1; i>=0&&i!=0xffffffff; --i )

    i为 无符号整型, 但--i 到了 -1的时候,i成了最大的无符号整数0xffffffff。因此
    该i>=0 条件永远成立。vector 越界之后 取到的数就是 无法预知的了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Mnky
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 2

    发表于:2008-05-16 14:19:0711楼 得分:1
    就是因为 vector <int>::size_type 是unsigned 的,所以i>=0永远成立。不是输出错误,而是输出了321以后,又输出了好多乱七八糟的东西。
    你直接吧i定义为int不就好了,呵呵。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • jieao111
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-16 19:27:3812楼 得分:1
    用迭代器
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • dadatech
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-16 20:32:4513楼 得分:1
    这个陷阱还真是比较迷惑人,不过,只要调试一下大都能明白。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • effective_person
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-16 21:04:2914楼 得分:1
    顶一个!
    sf 啊???
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • kingstarer
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-16 21:27:0315楼 得分:1
    学习了,一直没注意到这个
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • grellen
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-16 21:27:5016楼 得分:1
    学习
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ysuliu
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-16 22:06:4717楼 得分:1
    学习
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • sallan
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-17 09:13:1218楼 得分:1
    我也是来回帖的,看到大家的好建议
    真的很高兴,10楼和11楼的建议都很好
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • cswat
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-17 10:17:5919楼 得分:1
    学习了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • rickymathit
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-17 10:20:4720楼 得分:1
    到0之后再减变成了最大的正数,所以循环一直会进行下去
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hahaysw
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-17 10:28:5421楼 得分:1
    学习
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Oversense
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-17 11:43:1122楼 得分:1
    引用 20 楼 rickymathit 的回复:
    到0之后再减变成了最大的正数,所以循环一直会进行下去
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • oliver_wei
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-17 13:04:1123楼 得分:0
    用迭代器比较安全
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xhd3767
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-17 13:20:2524楼 得分:0
    for( vector <int>::size_type i=array.size()-1; i>=0; --i )......i>=0; --i
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • tangpanshui
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-17 13:38:5525楼 得分:0
    jf
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • stoneyrh
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-17 14:28:1826楼 得分:0
    吓我一跳,我以为没有一个输出是正确的呢
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ljq279318147
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-17 20:23:2227楼 得分:0
    --i当i = 0 时,i变成了负的了,还是迭代器安全一点
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • godspeed_wxw
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-17 20:31:4628楼 得分:0
    iterator
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lily604
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-17 20:48:5729楼 得分:0
    是啊 最好用迭代器
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • uplyh
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-18 01:48:5630楼 得分:0
    引用 3 楼 dahua010 的回复:
    vector  <int>::size_type i
    你的i 只能是正整形. 也就是说,当i是0的时候 --i 自然会是一个很大的数.

    而你后来的程序j>0;j--, 这样的话在j == 0 的时候就循环退出了. 所以可以正确输出

    我完全赞成3楼的,这个就涉及到了黑盒测试的技巧和经验了,一般都是临界值和条件修改容易出错,
    而且你说之前输出个很大的数说明是系统里的数,你没有对上你定义的数所在的内存。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • aasa11
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-18 10:50:1531楼 得分:0
    学习了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hiyoung
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-18 11:38:1432楼 得分:0
    引用 15 楼 kingstarer 的回复:
    学习了,一直没注意到这个
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • MagiSu
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-18 12:20:5733楼 得分:0
    应该用reverse_iterator,前面的注意了!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • visame
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-18 14:25:4634楼 得分:0
    老生常谈的问题了
    和0作等号比较的时候不要用unsigned int类型!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • learningl
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-18 15:09:2035楼 得分:0
    又学到东西啦。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • mymtom
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 2

    发表于:2008-05-18 16:46:2036楼 得分:0
    引用 23 楼 oliver_wei 的回复:
    用迭代器比较安全

    学习
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • luxiaoxun
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-18 18:12:5737楼 得分:0
    引用 10 楼 liyinlei 的回复:
    for( vector  <int>::size_type i=array.size()-1; i>=0; --i ) // 反向遍历array数组 

    修改为:

    for( vector  <int>::size_type i=array.size()-1; i>=0&&i!=0xffffffff; --i )

    i为 无符号整型, 但--i 到了 -1的时候,i成了最大的无符号整数0xffffffff。因此
    该i>=0 条件永远成立。vector 越界之后 取到的数就是 无法预知的了


    size_type:unsigned int别名
    unsigned int,当它与一个int进行算术运算时,int会升级为unsigned int,即转换成一个巨大的正整数。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zmlovelx
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-18 19:49:0538楼 得分:0
    引用 36 楼 mymtom 的回复:
    引用 23 楼 oliver_wei 的回复:
    用迭代器比较安全

    学习
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • GHOSTPE999
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-19 04:37:4539楼 得分:0


    for( vector <int>::size_type ix=0; ix!=array.size(); ++i, ) // 反向遍历array数组
    {

    cout  < < array[array.size()-ix]  < < endl;
    }


    可以么?会不会越界~?  for循环是先执行 ++i 还是先执行表达式cout?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • GHOSTPE999
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-19 04:40:1240楼 得分:0
    我从C++PRIMAR 上面看 说这样风格好看些~  而且ix使用!=判定可以有效防止越界的错误`?

    但是没有详细的原因~  为什么`?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wshk_xl
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2009-06-04 04:51:3741楼 得分:0
    对于size_type 得定义是size_t , size_t 为unsigned int.所以lz的写法导致数据溢出。

    对于STL中的element的访问,最好使用迭代器。你的这种做法就有待于商议(STL迭代器的设计目的就是将数据存取和具体类型解耦...)。
    你不要倒着输出吗?为什么不这么做呢,清晰明了。
    copy(a.rbegin(),a.rend(), ostream_iterator <int>(cout, " "));

    如果是其他比较复杂的运算,可以考虑function object.
    for_each(a.begin(), a.end(), funcobj()); //funcobj为你自定义的 function object
    修改 删除 举报 引用 回复