可以對C++迭代器進行自增以及使用解引用操作符來讀取值,但不能對該元素值賦值,因為C++迭代器對所有的容器都適用,現代C++程序更傾向於使用迭代器而不是下標操作訪問容器元素,即使對支持下標操作的vector類型也這樣。
標准庫為每一種標准容器包括vector)定義了一種迭代器類型。迭代器類型提供了比下標操作更一般化的方法:所有的標准庫容器都定義了相應的迭代器類型,而只有少數的容器支持下標操作。
1. 容器的iterator類型
每種容器類型都定義了自己的迭代器類型,如vector:vector
術語:迭代器和C++迭代器類型程序員首次遇到有關迭代器的術語時可能會困惑不解,產生困惑的原因之一是由於本書中同一個術語iterator表示兩個不同的事物。一般性提及的是迭代器的概念;而特別提及的則是由容器定義的具體的iterator類型,如vector
重點要理解的是,定義了許多用作迭代器的類型,這些類型在概念上是相關的。若一種類型支持一組確定的行為這些行為允許程序員遍歷容器內的元素,並允許程序員訪問這些元素值)。
我們就稱這種類型為迭代器。不同的容器類定義了自己的iterator類型,用於訪問容器內的元素。換句話說,每個容器定義了一種名為iterator的類型,而這種類型支持概念上的)迭代器的各種行為。
2. begin和end操作
每種容器都定義了一對命名為begin和end的函數,用於返回迭代器。如果容器中有元素的話,由begin返回的迭代器指向第一個元素把iter初始化為由名為begin的vector操作返回的值。假設vector不空,初始化後,iter即指該元素為ivec[0]。
由end操作返回的迭代器指向vector的“末端元素的下一個”。通常稱為超出末端迭代器(off-the-end iterator),表明它指向了一個不存在的元素。如果vector為空,begin返回的迭代器與end返回的迭代器相同。由end操作返回的迭代器並不指向vector中任何實際的元素,相反,它只是起一個哨兵sentinel)的作用,表示我們已處理完vector中所有元素。
3. C++迭代器的自增和解引用運算
C++迭代器類型定義了一些操作來獲取迭代器所指向的元素,並允許程序員將迭代器從一個元素移動到另一個元素。迭代器類型可使用解引用操作符*操作符)來訪問迭代器所指向r 元素解引用操作符返回迭代器當前所指向的元素。
假設iter指向vector對象ivec的第一個元素,那麼*iter和ivec[0]就是指向同一個元素。上面這個語句的效果就是把這個元素的值賦為0。迭代器使用自增操作符1.4.1節)向前移動迭代器指向容器中下一個元素。從邏輯上說,迭代器的自增操作和int型對象的自增操作類似。
對int對象來說,操作結果就是把int型值“加1”,而對迭代器對象則是把容器中的迭代器“向前移動一個位置”。因此,如果iter指向第一個元素,則++iter指向第二個元素。由於end操作返回的C++迭代器不指向任何元素,因此不能對它進行解引用或自增操作。
4. C++迭代器的其他運算
另一對可執行於迭代器的操作就是比較:用==或!=操作符來比較兩個迭代器,如果兩個迭代器對象指向同一個元素,則它們相等,否則就不相等。