(2020.06.25)增加一种遍历方式,如下:
cout << endl << "第五种遍历方法:" << endl;
for (auto& val : v)
{
cout << val << " ";
}
cout << endl;
使用迭代器iterator遍历vector<int>的过程中,按照教程用4种方式输出,前面三种都没有问题;
到第四种的时候,因为自己想多了一点,遇到了小问题
原教程的第四种遍历如下:(只遍历了偶数位置的数据),这种情况下没有出现问题)
cout << endl << "第四种遍历方法:" << endl;
it = v.begin();
while (it < v.end()) { //间隔一个输出
cout << *it << " ";
it += 2; // 随机访问迭代器支持 "+= 整数" 的操作
}
我多想的一点是:把剩下的奇数位置的数据继续输出,于是我在后面又加入了下面的代码
it = v.begin()+1;
while (it < v.end()) { //间隔一个输出
cout << *it << " ";
//=======报错的位置=============//
if((it+2)<=v.end())//报错,
it += 2; // 随机访问迭代器支持 "+= 整数" 的操作
else
break;
}
而报错的内容如下:
大概意思就是说我在给迭代器赋值的过程中,最后的 it+2 超出了 v.end 的范围,这是不被允许的
于是我对上面的错误代码,做了如下修改(2种方式)
//if (v.end() - it >= 2)//正确输出
//if(v.end()-2>=it)//正确输出
经过这样的修改以后,程序都能够正常的运行了,也就是说这样的修改,避免了让指针超出范围的规定
如果按照数学表达式的转换来看,他们其实是一样的,但是在程序中却出现了不同的“解释”,如果有大神看到我这里的记录,希望可以为我解惑
完整代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<string>
#include<vector>
#include<iterator>
using namespace std;
void test01()
{
vector<int> v;
int i;
for ( i = 0; i < 10; i++)
v.push_back(i + 10);
cout << "第一种遍历方法:" << endl;
//size返回元素个数
for ( i = 0; i < (int)v.size(); ++i)
cout << v[i] << " ";
cout << endl;
cout << endl << "第二种遍历方法:" << endl;
vector<int>::iterator it;
//用 != 比较两个迭代器
for (it = v.begin(); it != v.end(); it++)
cout << *it << " ";
cout << endl;
cout << endl << "第三种遍历方法:" << endl;
for ( it = v.begin(); it < v.end(); ++it) //用 < 比较两个迭代器
cout << *it << " ";
cout << endl;
cout << endl << "第四种遍历方法:" << endl;
it = v.begin();
while (it < v.end()) { //间隔一个输出
cout << *it << " ";
it += 2; // 随机访问迭代器支持 "+= 整数" 的操作
}
it = v.begin()+1;
while (it < v.end()) { //间隔一个输出
cout << *it << " ";
//if (v.end() - it >= 2)//正确输出
if(v.end()-2>=it)//正确输出
//if((it+2)<=v.end())//报错,
it += 2; // 随机访问迭代器支持 "+= 整数" 的操作
else
break;
}
cout << endl << "第五种遍历方法:" << endl;
for (auto& val : v)
{
cout << val << " ";
}
cout << endl;
}
int main()
{
test01();
freopen("CON", "r", stdin);//将标准输入重定向为 CON 控制台
cin.clear();//清除cin中的错误,恢复为默认状态
cout << endl << endl << "程序结束,按回车退出" << endl;
cin.get();
return EXIT_SUCCESS;
}