关于《C++ Primer(第四版)》习题 4.8 的思考

今天做《C++ Primer(第四版)》的习题 4.8,发现了配套题解书该题答案的一点小问题。

是关于原题第二问的,判断两个vector是否相等。

习题解答中给出的答案为:

 

// 4.8-2编写程序判断两个数组是否相等,然后编写一段类似的程序比较两个vector。
// 判断两个vector是否相等
// 使用迭代器访问vector中的元素

#include 
< iostream >
#include 
< vector >
#include
< conio.h >

using   namespace  std;

int  main()

{

    vector
<int> ivec1, ivec2;
    
int ival;
    
//读入两个vector的元素值
    cout << "Enter numbers for vector1(-1 to end):" << endl;
    cin 
>> ival;
    
while (ival != -1{
        ivec1.push_back(ival);
        cin 
>> ival;
    }

    cout 
<< "Enter numbers for vector2(-1 to end):" << endl;
    cin 
>> ival;
    
while (ival != -1{
        ivec2.push_back(ival);
        cin 
>> ival;
    }

    
//判断两个vector是否相等
    if (ivec1.size() != ivec2.size())        //长度不等的vector不相等
        cout << "Vector1 is not equal to vector2." << endl;
    
else if (ivec1.size() == 0)              //长度都为0的vector相等
        cout << "Vector1 is equal to vector2." << endl;
    
else {                                       //两个vector长度相等且不为0
        vector<int>::iterator iter1, iter2;
        iter1 
= ivec1.begin();
        iter2 
= ivec2.begin();
        
while (*iter1 == *iter2 && iter1 != ivec1.end() && iter2 != ivec2.end()) {
            
++iter1;
            
++iter2;
        }

        
if (iter1 == ivec1.end())//所有元素都相等
            cout << "Vector1 is equal to vector2." << endl;
        
else
            cout 
<< "Vector1 is not equal to vector2." << endl;
    }

    
return 0;
}

 

不知道是不是编译器原因,在我的VC+ 2005中编译能通过,但是运行时如果输入的两个vextor相等时程序会发生异常中断。如图:

习题4.8出错对话框

刚开始百思不得其解,最后单步半天,终于将错误原因定位到了这一句代码上

 

while  ( * iter1  ==   * iter2  &&  iter1  !=  ivec1.end()  &&  iter2  !=  ivec2.end())

因为在 VC++ 2005 中对 && 符号的运算顺序是自左至右,这句话是先判断 *iter1==*iter2,再判断 iter1 != ivec1.end() ,最后判断 iter2 != ivec2.end()。当然这三步有一步不成立,则while循环就会终止了。

问题就出在这里,当输入的 ivec1 和  ivec2 的内容相等时,比如都是 1  2  3 时,在执行到 while 循环时,依次比较  ivec1 和  ivec2 的对应数值是否相等,如果相等的话,则迭代器 iter1 和 iter2 都做一次自增运算++。关键是当比较完第三个数字 3 后,iter1 和 iter2 都分别指向了容器的末端元素的下一个位置,即 iter1=ivec1.end(), iter2=ivec2.end(),此时程序返回到 while 循环条件继续判断,先做判断 *iter1==*iter2,因为此时 iter1 和iter2 都不指向两个容器中任何元素,执行这个判断肯定要出错了。怪不得程序运行到这里时,系统“咚”的一声就弹出了一个错误对话框。害我调试了半天。

其实解决起来倒是简单,一是把 while 循环条件中的 *iter1==*iter2 写到最后,

 

while (  iter1 != v1.end()  &&  iter2 != v2.end()   &&   * iter1 ==* iter2 ) 

二是把 while 语句改为for语句

for(iter1=v1.begin(),iter2=v2.begin();iter1!=v1.end() && iter2!=v2.end())
        if(*iter1==*iter2)
           {
               ++iter1;
               ++iter2;
          }

不过改完后细想,这个题还是用for循环最为稳妥,因为用while循环,即使改了循环条件几个语句的顺序,但是换到另外的编译器里,如果 &&  的运算顺序是自右至左的话,还是会出错。因此用for是最把握的了。

看来写代码时这些细节东西还是要注意的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值