我們已經知道可以使用下標操作符來訪問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運算子的使用,下面舉兩個列子:
當不使用*符號時,進行加法操作,變的只是it變數,對於v中的的第乙個元素並沒有發生改變,這種操作相當於:把v中的第乙個元素賦值給it變數
對於上圖,我們使用了*,那麼我們可以發現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演算法的介面,而指標是迭代器,關於兩者的區別,在於:
迭代器不是指標,他只是類模板,表現得像指標,他模仿了指標的許多操作。指標是狹義上的迭代器,迭代器是指標的抽象
迭代器返回的是物件的引用,而不是物件的值(所以對於cout操作,只能輸出*迭代器,而不能直接輸出迭代器)
迭代器在使用後就被釋放了,不能再繼續使用了,但是指標可以
** 總之,指標和迭代器是有很大差別的,雖然他們表現的行為相似,但是本質是不一樣的!乙個是類模板,乙個是存放乙個傢伙的位址的指標變數**
c 容器演算法迭代器初識 容器演算法迭代器
c 容器演算法迭代器初識 容器演算法迭代器 stl中最常用的為迭代器vector,可以理解為陣列,下面我們將學習如何向這個容器 中插入資料 並遍歷這個容器 容器 vector 演算法 for each 迭代器 vector iteator include include include using ...
2 C 中的引用
一.c 中的布林型別 c 中的布林型別只有true 和 false。true代表真,編譯器用1表示。false代表假,編譯器用0表示。include int main int argc,char argv 二 三目運算子的公升級 c語言中,三木運算子只能返回變數值,不能當左值使用。在c 中三目運算子...
2 C 中的引用
int a 10 int b a int b 是錯誤的必須初始化 引用在初始化後,不可以改變 int c 20 b c 賦值操作,而不是更改引用。include using namespace std 交換函式 1.值傳遞 形參不會修飾實參 void swap1 int a,int b void s...