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