什麽是C++的叠代器Interator?
容器就是數據結構的泛指,叠代器就是指針的泛指,可以指向元素。容器相當於壹個儲藏櫃,裏面裝的許多不同的物品就像是儲存的元素,比如面包、啤酒、蘋果、現金。要取得各個物體就得用與各個物體向匹配的工具,如取出面包要用盤子、取出啤酒要用杯子、取出蘋果要用籃子、取出現金要用錢包。叠代器的作用就相當於取出物品的工具的抽象,通過叠代器泛指現實生活中從貯藏室中取出物體的工具。C++叠代器是壹種檢查容器內元素並遍歷元素的數據類型。1 Iterator definitionsIn C++, an iterator is any object that, pointing to some element in a range of elements (such as an array or a container), has the ability to iterate through the elements of that range using a set of operators (at least, the increment (++) and dereference (*) operators).The most obvious form of iterator is a pointer: A pointer can point to elements in an array, and can iterate through them using the increment operator (++). But other forms of iterators exist. For example, each container type (such as a vector) has a specific iterator type designed to iterate through its elements in an efficient way.C++叠代器Interator就是壹個指向某種STL對象的指針。通過該指針可以簡單方便地遍歷所有元素。 C++中的iterator為STL中的重要概念。iterator的概念源自於對遍歷壹個線性容器工具的抽象,即如何妳能訪問這個容器的某個元素。對於最簡單的數組,當然可以用數組的索引值,因為數組是連續存放在內存中的;但對於鏈表,就必須用指針。除此之外,還有還有很多種數據結構需要提供壹個方便的工具來訪問其中的元素,方法有ID,關鍵字等等。為了統壹所有的容器的這種工具的使用,壹般提供壹整套容器的開發者就會用壹種方式來表示各種容器的訪問工具。例如C++ STL就是使用iterator。MFC自己的容器使用position。C#和java也有自己的方法,但方法是不變的。 iterator的用法可以被統壹,但不同的底層容器實現其iterator的原理是不壹樣的。例如iterator++妳可以理解為移動到容器的下壹個元素,如果底層如果是數組,把索引值加壹就行;如果底層是鏈表,就得執行類似於m_pCurrent = m_pCurrent-> pNext;的操作。因此每種容器都有自己的iterator實現方法。C++ STL iterator的常用方法有:iterator++ 移到下個元素iterator-- 移到上個元素*iterator 訪問iterator所指元素的值< > == != iterator之間的比較,例如判斷哪個元素在前iterator1 + iterator2 iterator之間的加法運算,類似於指針加法 2 容器的 iterator 類型每種容器類型都定義了自己的C++叠代器類型,如 vector:vector<int>::iterator iter;這符語句定義了壹個名為 iter 的變量,它的數據類型是 vector<int> 定義的 iterator 類型。每個標準庫容器類型都定義了壹個名為 iterator 的成員,這裏的 iterator 與叠代器實際類型的含義相同。begin 和 end 操作每種容器都定義了壹對命名為 begin 和 end 的函數,用於返回叠代器。如果容器中有元素的話,由 begin 返回的叠代器指向第壹個元素: vector<int>::iterator iter = ivec.begin();上述語句把 iter 初始化為由名為 vector 操作返回的值。假設 vector 不空,初始化後,iter 即指該元素為ivec[0]。由end 操作返回的C++叠代器指向 vector 的“末端元素的下壹個”。“超出末端叠代器”(off-the-end iterator)。表明它指向了壹個不存在的元素。如果 vector 為空,begin 返回的叠代器與 end 返回的叠代器相同。由 end 操作返回的叠代器並不指向 vector 中任何實際的元素,相反,它只是起壹個哨兵(sentinel)的作用,表示我們已處理完 vector 中所有元素。a)使用叠代器讀取vector中的每壹個元素vector<int> ivec(10,1);for(vector<int>::iterator iter=ivec.begin();iter!=ivec.end();++iter){*iter=2; //使用 * 訪問叠代器所指向的元素}b)const_iterator只能讀取容器中的元素,而不能修改for(vector<int>::const_iterator citer=ivec.begin();citer!=ivec.end();citer++){cout<<*citer;//*citer=3; error}3 vector 叠代器的自增和解引用運算C++叠代器類型定義了壹些操作來獲取叠代器所指向的元素,並允許程序員將叠代器從壹個元素移動到另壹個元素。叠代器類型可使用解引用操作符(dereference operator)(*)來訪問叠代器所指向的元素:*iter = 0;解引用操作符返回叠代器當前所指向的元素。假設 iter 指向 vector 對象 ivec 的第壹元素,那麽 *iter 和ivec[0] 就是指向同壹個元素。上面這個語句的效果就是把這個元素的值賦為 0。叠代器使用自增操作符向前移動叠代器指向容器中下壹個元素。從邏輯上說,C++叠代器的自增操作和int 型對象的自增操作類似。對 int 對象來說,操作結果就是把 int 型值“加 1”,而對叠代器對象則是把容器中的叠代器“向前移動壹個位置”。因此,如果 iter 指向第壹個元素,則 ++iter 指向第二個元素。由於 end 操作返回的叠代器不指向任何元素,因此不能對它進行解引用或自增操作。