C++ 迭代器
除了下標(biāo)之外我們還可以用一種更加通用的方法來實現(xiàn)對vector等對象的訪問,這就是迭代器,后面我們還會介紹標(biāo)準(zhǔn)庫中的其他集中容器,他們都可以使用迭代器,但是只有少數(shù)支持下標(biāo)訪問。
迭代器和指針類似,可以訪問某個元素,也能在元素中移動。迭代器有有效和無效之分,這一點和指針差不多,有效迭代器要么指向某個元素,要么指向容器中的下一個元素,否則就是無效的。
使用迭代器
和指針不一樣的時,迭代器不是使用取址符,有迭代器的類型同時擁有返回迭代器的成員。比如這些類型都擁有名為begin和end的成員,其中begin成員負(fù)責(zé)返回指向第一個元素的迭代器。

也就是說end成員指示的是容器的一個本不存在的“尾后”元素。這樣的元素就是一個我們已經(jīng)處理完畢所有元素的標(biāo)記。end成員返回的迭代器通常被稱為“尾后迭代器”,或者簡稱為“尾迭代器”。特殊情況下如果容器為空,則begin和end返回的是同一個迭代器,都是尾后迭代器。
迭代器運算符


end返回的迭代器并不實際指示某個元素,所以不能對其使用遞增或者解引操作。
迭代器類型
就像size_type類型一樣,一般來說我們也不用知道迭代器的精確類型,實際上那些擁有迭代器的標(biāo)準(zhǔn)庫類型使用iterator和const_iterator來表示迭代器的類型

如果vector對象或者string對象是一個常量,只能使用const_iterator。
迭代器和迭代器類型
迭代器有三個不同含義:
迭代器概念本身
容器定義的迭代器類型
某個迭代器對象
重點是理解存在一組概念上相關(guān)的類型,我們認(rèn)定某個類型是迭代器當(dāng)且僅當(dāng)它支持一套操作,這套操作是我們能訪問容器的元素從某個元素移動到另一個元素。每個容器類定義了一個名為iterator的類型,該類型支持迭代器概念所規(guī)定的一套操作。
begin和end運算符
begin和end的類型由對象是不是常量決定,如果是那返回const_iterator,否則返回iterator。

c++11的標(biāo)準(zhǔn)中有兩個函數(shù),cbegin和cend,不論vector對象是不是常量,返回值都是const_iterator。
結(jié)合解引和成員訪問操作

這里使用最后一行*vb外的括號必不可少,具體原因會在后面解釋,這里只用知道,如果不加括號點運算符將由vb來執(zhí)行,而非vb解引后的結(jié)果。這樣的情況我們可以用箭頭運算符->來運算,(*vb).pos和vb->pos的意義相同。
對某些vector對象的操作會使迭代器失效
已知的一個是不能在范圍for中向vector對象添加元素。另外一個就是任何一種可能改變vector對象容量的操作比如push_back都會使vector對象的迭代器失效,后面我們會詳細(xì)解釋他們?nèi)绾问У摹?/p>
迭代器運算

只要兩個迭代器指向的是同一個容器的元素或者尾元素的下一個位置,就可以相加減,得到的是一個difference_type的帶符號整型數(shù)。