對(duì)C++迭代器工作原理說(shuō)明介紹
可以對(duì)C++迭代器進(jìn)行自增以及使用解引用操作符來(lái)讀取值,但不能對(duì)該元素值賦值,因?yàn)?FONT size=+0>C++迭代器對(duì)所有的容器都適用,現(xiàn)代C++程序更傾向于使用迭代器而不是下標(biāo)操作訪問(wèn)容器元素,即使對(duì)支持下標(biāo)操作的vector類(lèi)型也這樣。
標(biāo)準(zhǔn)庫(kù)為每一種標(biāo)準(zhǔn)容器(包括vector)定義了一種迭代器類(lèi)型。迭代器類(lèi)型提供了比下標(biāo)操作更一般化的方法:所有的標(biāo)準(zhǔn)庫(kù)容器都定義了相應(yīng)的迭代器類(lèi)型,而只有少數(shù)的容器支持下標(biāo)操作。
1. 容器的iterator類(lèi)型
每種容器類(lèi)型都定義了自己的迭代器類(lèi)型,如vector:vector
術(shù)語(yǔ):迭代器和C++迭代器類(lèi)型程序員***遇到有關(guān)迭代器的術(shù)語(yǔ)時(shí)可能會(huì)困惑不解,產(chǎn)生困惑的原因之一是由于本書(shū)中同一個(gè)術(shù)語(yǔ)iterator表示兩個(gè)不同的事物。一般性提及的是迭代器的概念;而特別提及的則是由容器定義的具體的iterator類(lèi)型,如vector
重點(diǎn)要理解的是,定義了許多用作迭代器的類(lèi)型,這些類(lèi)型在概念上是相關(guān)的。若一種類(lèi)型支持一組確定的行為(這些行為允許程序員遍歷容器內(nèi)的元素,并允許程序員訪問(wèn)這些元素值)。
我們就稱(chēng)這種類(lèi)型為迭代器。不同的容器類(lèi)定義了自己的iterator類(lèi)型,用于訪問(wèn)容器內(nèi)的元素。換句話說(shuō),每個(gè)容器定義了一種名為iterator的類(lèi)型,而這種類(lèi)型支持(概念上的)迭代器的各種行為。
2. begin和end操作
每種容器都定義了一對(duì)命名為begin和end的函數(shù),用于返回迭代器。如果容器中有元素的話,由begin返回的迭代器指向***個(gè)元素把iter初始化為由名為begin的vector操作返回的值。假設(shè)vector不空,初始化后,iter即指該元素為ivec[0]。
由end操作返回的迭代器指向vector的“末端元素的下一個(gè)”。通常稱(chēng)為超出末端迭代器(off-the-end iterator),表明它指向了一個(gè)不存在的元素。如果vector為空,begin返回的迭代器與end返回的迭代器相同。由end操作返回的迭代器并不指向vector中任何實(shí)際的元素,相反,它只是起一個(gè)哨兵(sentinel)的作用,表示我們已處理完vector中所有元素。
3. C++迭代器的自增和解引用運(yùn)算
C++迭代器類(lèi)型定義了一些操作來(lái)獲取迭代器所指向的元素,并允許程序員將迭代器從一個(gè)元素移動(dòng)到另一個(gè)元素。迭代器類(lèi)型可使用解引用操作符(*操作符)來(lái)訪問(wèn)迭代器所指向r 元素解引用操作符返回迭代器當(dāng)前所指向的元素。
假設(shè)iter指向vector對(duì)象ivec的***個(gè)元素,那么*iter和ivec[0]就是指向同一個(gè)元素。上面這個(gè)語(yǔ)句的效果就是把這個(gè)元素的值賦為0。迭代器使用自增操作符(1.4.1節(jié))向前移動(dòng)迭代器指向容器中下一個(gè)元素。從邏輯上說(shuō),迭代器的自增操作和int型對(duì)象的自增操作類(lèi)似。
對(duì)int對(duì)象來(lái)說(shuō),操作結(jié)果就是把int型值“加1”,而對(duì)迭代器對(duì)象則是把容器中的迭代器“向前移動(dòng)一個(gè)位置”。因此,如果iter指向***個(gè)元素,則++iter指向第二個(gè)元素。由于end操作返回的C++迭代器不指向任何元素,因此不能對(duì)它進(jìn)行解引用或自增操作。
4. C++迭代器的其他運(yùn)算
另一對(duì)可執(zhí)行于迭代器的操作就是比較:用==或!=操作符來(lái)比較兩個(gè)迭代器,如果兩個(gè)迭代器對(duì)象指向同一個(gè)元素,則它們相等,否則就不相等。
【編輯推薦】

















