今天做,发现了配套题解书该题答案的一点小问题。
是关于原题第二问的,判断两个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是最把握的了。
看来写代码时这些细节东西还是要注意的。