計算機二級輔導:C++迭代器簡介

字號:

除了使用下標來訪問vector對象的元素外,標準庫還提供了另一種檢測元素的方法:使用迭代器(iterator)。迭代器是一種允許程序員檢查容器內(nèi)元素,并實現(xiàn)元素遍歷的數(shù)據(jù)類型。
    標準庫為每一種標準容器(包括vector)定義了一種迭代器類型。迭代器類型提供了比下標操作更一般化的方法:所有的標準庫容器都定義了相應的迭代器類型,而只有少數(shù)的容器支持下標操作。因為迭代器對所有的容器都適用,現(xiàn)代C++程序更傾向于使用迭代器而不是下標操作訪問容器元素,即使對支持下標操作的vector類型也這樣。
    具體討論迭代器的工作原理,但在完全了解它復雜的實現(xiàn)細節(jié)之前,我們一樣可以先使用它。
    1. 容器的iterator類型
    每種容器類型都定義了自己的迭代器類型,如vector:
    vector::iterator iter;
    這條語句定義了一個名為iter的變量,它的數(shù)據(jù)類型是由vector定義的iterator類型。每個標準庫容器類型都定義了一個名為iterator的成員,這里的iterator與迭代器實際類型的含義相同。
    術語:迭代器和迭代器類型
    程序員首次遇到有關迭代器的術語時可能會困惑不解,產(chǎn)生困惑的原因之一是由于本書中同一個術語iterator表示兩個不同的事物。一般性提及的是迭代器的概念;而特別提及的則是由容器定義的具體的iterator類型,如vector。
    重點要理解的是,定義了許多用作迭代器的類型,這些類型在概念上是相關的。若一種類型支持一組確定的行為(這些行為允許程序員遍歷容器內(nèi)的元素,并允許程序員訪問這些元素值),我們就稱這種類型為迭代器。
    不同的容器類定義了自己的iterator類型,用于訪問容器內(nèi)的元素。換句話說,每個容器定義了一種名為iterator的類型,而這種類型支持(概念上的)迭代器的各種行為。
    2. begin和end操作
    每種容器都定義了一對命名為begin和end的函數(shù),用于返回迭代器。如果容器中有元素的話,由begin返回的迭代器指向第一個元素:
    vector::iterator iter = ivec.begin();
    上述語句把iter初始化為由名為begin的vector操作返回的值。假設vector不空,初始化后,iter即指該元素為ivec[0]。
    由end操作返回的迭代器指向vector的“末端元素的下一個”。通常稱為超出末端迭代器(off-the-end iterator),表明它指向了一個不存在的元素。如果vector為空,begin返回的迭代器與end返回的迭代器相同。
    由end操作返回的迭代器并不指向vector中任何實際的元素,相反,它只是起一個哨兵(sentinel)的作用,表示我們已處理完vector中所有元素。
    3. vector迭代器的自增和解引用運算
    迭代器類型定義了一些操作來獲取迭代器所指向的元素,并允許程序員將迭代器從一個元素移動到另一個元素。
    迭代器類型可使用解引用操作符(*操作符)來訪問迭代器所指向r 元素:
    *iter = 0;
    解引用操作符返回迭代器當前所指向的元素。假設iter指向vector對象ivec的第一個元素,那么*iter和ivec[0]就是指向同一個元素。上面這個語句的效果就是把這個元素的值賦為0。
    迭代器使用自增操作符(1.4.1節(jié))向前移動迭代器指向容器中下一個元素。從邏輯上說,迭代器的自增操作和int型對象的自增操作類似。對 int對象來說,操作結(jié)果就是把int型值“加1”,而對迭代器對象則是把容器中的迭代器“向前移動一個位置”。因此,如果iter指向第一個元素,則++iter指向第二個元素。
    由于end操作返回的迭代器不指向任何元素,因此不能對它進行解引用或自增操作。
    4. 迭代器的其他運算
    另一對可執(zhí)行于迭代器的操作就是比較:用==或!=操作符來比較兩個迭代器,如果兩個迭代器對象指向同一個元素,則它們相等,否則就不相等。
    5. 迭代器應用的程序示例
    假設已聲明了一個vector型的ivec變量,要把它所有元素值重置為0,可以用下標操作來完成:
    // reset all the elements in ivec to 0
    for (vector::size_type ix = 0; ix != ivec.size(); ++ix)
    ivec[ix] = 0;
    上述程序用for循環(huán)遍歷ivec的元素,for循環(huán)定義了一個索引ix,每循環(huán)迭代一次ix就自增1。for循環(huán)體將ivec的每個元素賦值為0