迭代器是什么,还有迭代器失效问题?(浅析)

小编今天刚接触了迭代器,就想和大家分享一下了~~

首先让我们来了解一下迭代器它到底是个什么东东呐。。

迭代器的由来

迭代器

无论是序列容器还是关联容器,最常做的操作无非就是遍历容器中存储的元素,而实现此操作,多数情况会选用“迭代器(iteratot)”来实现。那么,迭代器到底是什么呢?

我们知道,尽管不同容器的内部结构各异,但它们本质上都是用来存储大量数据的,换句话说,都是一串能存储多个数据的存储单元。因此,诸如数据的排序、查找、求和等需要对数据进行遍历的操作方法应该是类似的。
既然类似,完全可以利用泛型技术,将它们设计成适用所有容器的通用算法,从而将容器和算法分离开。但实现此目的需要有一个类似中介的装置,它除了要具有对容器进行遍历读写数据的能力之外,还要能对外隐藏容器的内部差异,从而以统一的界面向算法传送数据。
这是泛型思维发展的必然结果,于是迭代器就产生了。简单来讲,迭代器和 C++ 的指针非常类似,它可以是需要的任意类型,通过迭代器可以指向容器中的某个元素,如果需要,还可以对该元素进行读/写操作。

eg:

int main()
{
	vector<int> vec = {12,23,34,45,56};
	vector<int>::iterator it = vec.begin();
	vec.insert(it,10);

	return 0;
}

迭代器失效

大家可以先看看下面的代码对不对呢?

#include<vector>
using namespace std;

void ForwardPrint(const vector<T>& vec)
{
	cout<<"size: "<<vec.size()<<"\t"<<"capacity: "<<vec.capacity()<<endl;
	typename vector<int>::const_iterator it = vec.begin();
	for(;it != vec.end();it++)
	{
		cout<<*it<<" ";
	}
	cout<<endl;
}

int main()
{
	vector<int> vec = {122334455667};
	ForwardPrint(vec);
	vector<int>::iterator it = vec.begin();
	cout<<*it<<endl;
	vec.insert(it,100);
	cout<<*it<<endl;
	
	return 0;
}

上面代码其实是不正确的,产生了迭代器失效问题
在这里插入图片描述
先开辟了一个vector空间对其也进行了初始化,但是最后再插入100时,vector空间不够,得进行扩容才可以再插入元素,就在这,出现了问题。我们之前对迭代器(iterator)的定义是在原来的vector上,也就是①号位置,但是重新扩容后,它的指向没有改变,还是在①号位置。当我们对扩容好的vector再去使用迭代器时就发生了迭代器失效问题。

: 迭代器失效
所以,我们要特别注意:系统在处理时,无论增空间与否,都会让迭代器失效,因为用户根本不清楚到底增空间了没。
凡是用vec.begin()获得 迭代器时,eg: (vectoe::iterator it = vec.begin()😉,再对向量进行插入元素,删除元素都将会使前期的迭代器失效,也就是说,插入完数据或删除完数据后,必须对迭代器再次初始化或赋值(只要增删空间了,就认为迭代器失效了)。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值