欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

迭代器的使用及问题

程序员文章站 2023-01-22 20:10:47
迭代器虽然拥有指针的功能,但不是指针!其最重要的便是内容提纲和成员访问。 迭代器是一种类似指针的对象,其重载了指针->,*,++ --等操作符,其实质是封装了原生指针,为了为容器提供统一的接口, 一、声明 容器类型::iterator 迭代器名称 例如:vector::i ......

迭代器虽然拥有指针的功能,但不是指针!其最重要的便是内容提纲和成员访问。

迭代器是一种类似指针的对象,其重载了指针->,*,++ --等操作符,其实质是封装了原生指针,为了为容器提供统一的接口,

一、声明

容器类型<typpe,.>::iterator 迭代器名称

例如:vector<int>::iterator iter;

二、迭代器失效

向容器中添加或者删除数据都有可能导致迭代器失效

(1)顺序容器(vector,deque)

顺序容器即使用了连续分配的内存,在向容器中添加或者删除数据时,都将使当前插入或者删除后面的元素向前或者向后移动一个位置,存在指向已经发生移动的数据的迭代器将失效,使用以及失效的迭代器自增或者是操作直接使程序崩溃!使不得使不得啊!

迭代器的使用及问题

在使用vector和deque的erase()时,返回的是当前删除节点的下一个迭代器,故使用for循环删除时,应该明确指出迭代器ite接收下一个iterator。

 

 

 迭代器的使用及问题

 

 (2)关联容器

 关联容器在删除或者添加元素时,将使指向当前元素迭代器失效。对于map的erase()函数,其删除后返回下一个元素的迭代器,且被删除元素的后面的迭代器依然有效。

迭代器的使用及问题

 

 

注意:end()函数指向的是容器最后一个元素的后一个位置,如果直接取值将会报错,使程序崩溃!

解决方案:在循环迭代删除的时候可以使用如下方法,先将参数ite传给erase,然后自增(ite++),最后再执行erase()函数。

迭代器的使用及问题

 

 

 

(3)链表型容器(list)

此类容器删除会使指向删除位置的迭代器失效,除此之外的迭代器仍然保持有效。解决方法erase(*it)会返回下一个有效迭代器的值,或者erase(it++)

 

参考:https://blog.csdn.net/lujiandong1/article/details/49872763