刚刚开始学习C++,做到习题4.8的时候测试不过,参考代码如下:
#include<iostream>
#include<vector>
using std::vector;
using std::cout;
using std::cin;
using std::endl;
//编写程序判断两个数组是否相等,然后把这段代码改用 vector实现
int main()
{
vector<int> ivec1, ivec2;
int cval;
//读入两个vector的元素值
cout << "Enter the numbers of vector1(-1 to quit):"<<endl;
cin >> cval;
while (cval != -1)
{
ivec1.push_back(cval);
cin >> cval;
}
cout << "Enter the numbers if vector2(-1 to quit)"<<endl;
cin>> cval;
while (cval != -1)
{
ivec2.push_back(cval);
cin >> cval;
}
if (ivec1.size() != ivec2.size()) //长度不等的 不相等
cout << "Vector1 in not equal to vector2." << endl;
else if (ivec1.size() == 0 ) //长度都为0的相等 一个为0 就行 因为已经是相等了 不用写 (ivec1.size() == 0 && ivec2.size() == 0)
cout << "Vector1 is equal to vector2." << endl;
else //长度相等切都不为0的
{
vector<int>::iterator item1, item2;
item1 = ivec1.begin();
item2 = ivec2.begin();
while (*item1 == *item2 && item1 != ivec1.end() && item2 != ivec2.end() )
{
++item1;
++item2;
}
if (item1 == ivec1.end())
cout << "Vector1 is equal to vector2." << endl;
else
cout << "Vector1 is not equal to vector2." << endl;
}
return 0;
}
练习到这题的时候如果测试的两组数据相等就会弹出错误
后来F11步进发现走到
while (*item1 == *item2 && item1 != ivec1.end() && item2 != ivec2.end() )
出看问题,思索半天,发现如果这两个容器相等,迭代器到最后的时候item和item都指向容器外的元素,这时候去比较元素 *item1和 *item2就无法比较了,就报错了,可以把 *item1 == *item2
放到 item1 != ivec1.end() && item2 != ivec2.end()
之后或者任意一个后面就可以了:
while ( item1 != ivec1.end() && item2 != ivec2.end()&&*item1 == *item2 )
后来搜索到大神的文章 《关于《C++ Primer(第四版)》习题 4.8 的思考》.
说的真好,出了大神文章中提到的方法,我又想到了还可以这样改:
while (item1 != ivec1.end() && item2 != ivec2.end())
{
if (*item1 == *item2)
{
++item1;
++item2;
}
}
说实话本人刚刚学习C++,for循环的像上面文章中的用法不大会用,用while好理解一些,但是理论上for循环和while都可以互相改写的吧。
2020 我要加油!