迭代器与指针

    在使用vector、map等容器的迭代器的时候,常常会与指针弄混(注意,容器适配器 stack、queue 和 priority_queue 没有迭代器,可以使用这些容器自带的成员函数

来对元素进行访问),因为他们的一些使用方法有些类似,还是举个例子:

    vector<int> v; //先声明一个vector容器

    vector<int>iterator ::iter;   //声明vector容器的迭代器,但此时iter并没有指向vector容器v

    iter=v.begin();    //让迭代器iter指向v的头部,即v中第一个元素

    通过上面几条语句,让iter指向了v,就可以用迭代器iter来访问v中的元素或者遍历v了。方法就是用 * 操作符,即 *iter,此时*iter就是迭代器当前所指向的元素位置的值,

然后可以通过自增 ++、自减 - - 来改变迭代器的位置,从而可以访问不同的元素,有点类似于指针,但是二者也有较大区别,下面会列举出他们的主要区别:

迭代器:  1. 首先迭代器它不是指针,而是类模板,只是表现得像指针而已,就像上面的例子中那样。迭代器它模拟了指针的一些功能,通过重载  ‘—>’、'*'、

                    ‘++’、‘- -’(反向迭代器) 这些操作符(还有其他的一些操作符),封装了指针,提供了比指针更强大的功能,可以看作是智能指针。

                2. 迭代器与指针还有一个较大区别就是迭代器返回的是对象的引用,而不是对象的值,所以cout只能输出迭代器使用 * 取对象值后的值,而不能直接

                    输出其自身。

                3. 还有一点就是迭代器在使用过后就是释放了,不能再继续使用,而指针则可以继续使用。 

指针:  1. 指针可以指向函数,迭代器就不可以,迭代器只能指向容器。

             2. 指针是迭代器的一种,只能用于某些特定的容器,比如数组、结构体。

             3. 迭代器是指针的抽象和泛化,指针它满足迭代器的一切要求,但是二者还是有很大差别的。

有关迭代器的常用操作以及更多用法可以看看下面这几个链接,写的都非常好,最好都看一下互相补充。

  http://c.biancheng.net/view/338.html

  https://www.cnblogs.com/leijiangtao/p/12057113.html

  https://www.cnblogs.com/leijiangtao/p/12057113.html

原文地址:https://www.cnblogs.com/buanxu/p/12756125.html