容器学习2——C++中的迭代器

迭代器的介绍

我们已经知道可以使用下标操作符来访问string对象的字符或vector对象的元素,还有另外一种机制也可以实现同样的目的,这就是迭代器。除了vector外,标准库还定义了其他几种容器,所有标准库的容器都可以使用迭代器,但是只有其中少数几种才同时支持下标操作符。严格来说,string对象不属于容器类型,但是string类型支持与vector类似的操作。
对于迭代器而言,其对象是容器中的元素或者是string对象中的字符。使用迭代器可以访问某个元素,迭代器也能从一个元素移动到另外一个元素。迭代器有有效和无效之分,有效的迭代器或者指向某一个元素,或者指向容器中尾元素的下一位置;其他所有情况都属于无效。

使用迭代器

迭代器和指针有很多类似的地方,但是相比较指针来说,获取迭代器不是使用取地址符,有迭代器的类型同时拥有返回迭代器的成员,begin成员负责返回指向第一个元素(或者第一个字符)的迭代器,end成员则负责返回指向容器尾元素的下一个位置,也就是说,这样的迭代器并没有什么实际的意义,仅是一个标记而已,表示我们已经处理完了容器中的所有元素,end返回的通常称作尾后迭代器,特殊情况下如果容器为空,则begin和end返回的是同一个迭代器,都是尾后迭代器

标准迭代器的运算符
*iter 返回迭代器iter所指的引用
iter->mem 解引用iter并获取该元素的名为men的成员,等价于(*iter)->mem
++iter 令iter指示容器的下一个元素
–iter 令iter指示容器的上一个元素

需要注意的是关于*iter运算符的使用,下面举两个列子:
Alt
当不使用*符号时,进行加法操作,变的只是it变量,对于v中的的第一个元素并没有发生改变,这种操作相当于:把v中的第一个元素赋值给it变量
Alt
对于上图,我们使用了*,那么我们可以发现v[0]发生了变化,这种操作相当于使用了v[0]的引用。

关于迭代器类型

实际上,那些拥有迭代器的标准库类型使用iterator和const_iterator来表示迭代器的类型,iterator的对象可读可写,对于const_iterator类型的对象只能读取但是不能修改他所指的元素值,如果vector或者string对象是常量,则只能使用const_iterator来表示,如果是变量,则两者都可以使用
C++中引用了两个新函数,分别是cbegin()和cend(),两者都是返回const_iterator类型的元素

结合解引用和成员函数访问操作

解引用迭代器可获得迭代器所指的对象,如果该对象的类型恰好是类,就有可能进一步访问他的成员函数,为了简化表达式,C++语言定义了箭头运算符(->),箭头运算符把解引用和成员访问两个操作结合在一起,也就是说,it->mem和(*it).mem表达的意思相同

关于迭代器和指针的区别和知识点

在很多功能上,迭代器和指针确实有很多类似的地方,但是两者在概念上有很多的不同,迭代器是对容器遍历这一种操作的一种封装,迭代器是广义指针,而指针满足所有迭代器要求。迭代器是STL算法的接口,而指针是迭代器,关于两者的区别,在于:

  1. 迭代器不是指针,他只是类模板,表现得像指针,他模仿了指针的许多操作。指针是狭义上的迭代器,迭代器是指针的抽象
  2. 迭代器返回的是对象的引用,而不是对象的值(所以对于cout操作,只能输出*迭代器,而不能直接输出迭代器)
  3. 指针能指向函数而迭代器不行,迭代器只能指向容器(怎么理解这句话:在编译时,编译系统为函数分配一段存储空间,这段存储空间的起始地址(又称为函数入口)称为这个函数的指针。)
  4. 迭代器在使用后就被释放了,不能再继续使用了,但是指针可以
    ** 总之,指针和迭代器是有很大差别的,虽然他们表现的行为相似,但是本质是不一样的!一个是类模板,一个是存放一个家伙的地址的指针变量**
发布了37 篇原创文章 · 获赞 0 · 访问量 583

猜你喜欢

转载自blog.csdn.net/clearLB/article/details/104092701