使用迭代器iterator遍历vector遇到超出 v.end() 的报错,(2020.06.25)增加一种遍历方式

(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;
}

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值