文章目录
- 什么是迭代器?
- 迭代器的作用:
- 为什么要使用迭代器?
- vector容器中迭代器应该怎么使用
- 迭代器失效
- 插入元素后失效
- 删除元素后失效
什么是迭代器?
迭代器是一种检查容器内元素并且遍历容器内匀速的数据类型
迭代器的作用:
- 迭代器提供对一个对容器中的对象的访问方法,并且定义了容器中对象的范围
- 通过迭代器去访问vector元素,可以减少越界程度的发生
为什么要使用迭代器?
- STL提供每种容器的实现原理各不相同,如果没有迭代器我们需要记住每一种容器中对象的访问方法,很显然这样会很麻烦
- 每个容器都实现了一个迭代器对于容器中对象的访问,虽然每个容器中的迭代器的实现方式不一样,但是对于用户来说操作方法是一致的,也就是说通过迭代器统一了对所有容器的访问方式。例如:无论哪个容器,访问当前元素的下一个元素我们可以通过迭代器自增进行访问。
vector容器中迭代器应该怎么使用
vector::iterator iter;//变量名字为iter
vector 容器的迭代器属于“随即访问迭代器”:迭代器一次可以移动多个位置
int main()
{
vector<int>vecIntA;
int ar[] = { 10,20,30,40,50 };
vecIntA.assign(ar, ar + 5);
//构造一个迭代器对象
vector<int>::iterator it;
//让迭代器it指向vecIntA容器中的元素
it = vecIntA.begin();
cout << *it << endl; //实现了*号运算符的重载
//通过循环的方式使用迭代器遍历vecInA中的所有元素
for (it = vecIntA.begin(); it != vecIntA.end(); it++)
{
cout << *it << endl;
}
it = vecIntA.begin();
it = it + 2;
cout << *it << endl;
return 0;
}
迭代器失效
插入元素后失效
int main()
{
vector<int>v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
vector<int>::iterator it = v.begin() + 3;
//cout << *it << endl;
//insert函数会返回一个新的有效的迭代器
v.insert(it, 8); //程序崩溃,迭代器失效,插入元素导致原来容器空间v拷贝到新的空间了
cout << *it << endl;//旧的迭代器,会产生失效指针
}
插入元素后,导致原来空间v进行了搬迁,或者为深拷贝(将原来空间释放掉了,将原来空间的资源拷贝到了新的空间)
迭代器内部实现其实是指针的实现方式,原来的空间被delete或者free掉了,产生了悬空指针,其实对悬空指针进行了解引用
解决办法:
删除元素后失效
int main()
{
//删除元素导致迭代器失效的问题
vector<int>cond = { 1,2,3,3,3,3,4,5,6 };
vector<int>::iterator it;
for (it = cond.begin(); it != cond.end(); it++)
{
if (*it == 3)
{
cond.erase(it);
}
}
for (it = cond.begin(); it != cond.end(); it++)
{
cout << *it << endl;
}
return 0;
}
解决办法: