《C++ Primer(第四版)》的习题 4.8程序改正

今天做,发现了配套题解书该题答案的一点小问题。

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

 

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

//判断两个vector是否相等
//使用迭代器访问vector中的元素
#include <iostream>
#include <vector>
using namespace std;

int main()
{
	vector<int> ivec1,ivec2;
	int ival;
	
	//读入2个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 and none elements."<<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;
}


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

 

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

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


 

因为在 VS2010中对 && 符号的运算顺序是自左至右,这句话是先判断 *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==*iter2 写到最后,

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


 二是把 while 语句改为for语句

 

for(iter1=ivec1.begin(),iter2=ivec2.begin();
			iter1!=ivec1.end() && iter2!=ivec2.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、付费专栏及课程。

余额充值