迭代器知识整理

纵饮孤独 提交于 2020-02-08 16:11:22

对数组的访问可以使用下标运算符,对链表的访问可以使用指针,对容器对象的访问使用到一种更为通用的机制,迭代器(iterator)。所有的标准库容器都可以使用迭代器,类似于指针,迭代器可以访问某个元素,可以从一个元素移动到一个元素,迭代器有有效与无效之分。

使用迭代器

auto b=v.begin(),e=v.end();

begin负责返回指向容器第一个元素的迭代器,即b是指向容器v的第一个元素的迭代器,迭代器的类型不确定,用auto表示,即让编译器自己确定迭代器的类型;end负责返回指向容器尾元素的下一位置的迭代器,即指向的是一个不存在的“尾后”元素,返回的迭代器称为“尾后迭代器”。特俗情况下,如果容器为空,则begin和end返回的是同一个迭代器。

迭代器运算符

使用==和!=来两个比较迭代器是否相等,若两个迭代器指向的元素相同或者都是一个额容器的尾后迭代器,则相等,否则就说不相等。

//iter是迭代器
*iter;//返回迭代器iter所指向元素的引用
iter->mem;//相当于(*iter).mem,访问所指向元素的mem成员
++iter;//指向容器的下一元素
--iter;//指向容器的上一元素

注意:end返回的迭代器并不指向实际的某个元素,所以不能对其进行递增或解引用操作。

迭代器类型

一般来说我们并不知道(也无需知道)迭代器的精确类型。实际上,那些拥有迭代器的标准库类型使用iterator和const_iterator来表示迭代器的类型

vector<int>::iterator it;//表示迭代器it的数据类型是vector<int>定义的iterator类型,it指向的元素可读可写
vector<int>::const_iterator it2;//it2只能读元素,不能写元素

某些对vector对象的操作会使迭代器失效

但凡使用了迭代器的循环体,都不要向迭代器所属的容器添加元素。比如对于vector,push_back操作向容器中添加元素,会使该vector对象的迭代器失效。

迭代器运算

//iter是迭代器
iter+n;//n为整数,迭代器加上一个整数仍是一个迭代器,位置向前移动n
iter-n;//迭代器位置向后移动n
iter1-iter2;//两个迭代器相减是它们的距离,可正可负
>,>=,<,<=;//比较两个迭代器的前后位置关系

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!