在使用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