迭代器及巢狀類介紹
迭代器(iterator)是一種物件,它能夠用來遍歷標準模板庫容器中的部分或全部元素,每個迭代器物件代表容器中的確定的地址。迭代器修改了常規指標的介面,所謂迭代器是一種概念上的抽象:那些行為上像迭代器的東西都可以叫做迭代器。然而迭代器有很多不同的能力,它可以把抽象容器和通用演算法有機的統一起來。
迭代器提供一些基本操作符:*、++、==、!=、=。這些操作和C/C++“操作array元素”時的指標介面一致。不同之處在於,迭代器是個所謂的複雜的指標,具有遍歷複雜資料結構的能力。其下層執行機制取決於其所遍歷的資料結構。因此,每一種容器型都必須提供自己的迭代器。事實上每一種容器都將其迭代器以巢狀的方式定義於內部。因此各種迭代器的介面相同,型號卻不同。這直接匯出了
功能
迭代器使開發人員能夠在類或結構中支援foreach迭代,而不必整個實現IEnumerable或者IEnumerator介面。只需提供一個迭代器,即可遍歷類中的資料結構。當編譯器檢測到迭代器時,將自動生成IEnumerable介面或者IEnumerator介面的Current,MoveNext和Dispose方法。
特點
1.迭代器是可以返回相同型別值的有序序列的一段程式碼;
2.迭代器可用作方法、運算子或get訪問器的程式碼體;
3.迭代器程式碼使用yieldreturn語句依次返回每個元素,yield break
4.可以在類中實現多個迭代器,每個迭代器都必須像任何類成員一樣有惟一的名稱,並且可以在foreach語句中被客戶端,程式碼呼叫如下所示:foreach(int x in SimpleClass.Iterator2){};
5.迭代器的返回型別必須為IEnumerable和IEnumerator中的任意一種;
6.迭代器是產生值的有序序列的一個語句塊,不同於有一個 或多個yield語句存在的常規語句塊;
7.迭代器不是一種成員,它只是實現函式成員的方式,理解這一點是很重要的,一個通過迭代器實現的成員,可以被其他可能或不可能通過迭代器實現的成員覆蓋和過載;
8.迭代器塊在C#
9.yield關鍵字用於指定返回的值。到達yieldreturn語句時,會儲存當前位置。下次呼叫迭代器時將從此位置重新開始執行。 迭代器對集合類特別有用,它提供一種簡單的方法來迭代不常用的資料結構(如二進位制樹)。
簡介
迭代器是一種檢查容器內元素並遍歷元素的可帶泛型資料型別。
#include<iostream> usingnamespacestd; class_iterator { private: char*p; public: _iterator(char*str):p(str){} char*&operator++() { p+=1;//跟p++同價; returnp; } }; intmain() { char*p="ThisisC++program"; _iteratorit(p); cout<<"++之前:"<<p<<endl; char*p1=++it; //把地址向前加了一個char型長度,然後給指標p1 cout<<"++之後:"<<p1<<endl; return0; }
巢狀類
在一個類體中定義的類叫作巢狀類。擁有巢狀類的類叫外圍類。
定義巢狀類的初衷是建立僅供某各類使用的類,目的在於隱藏類名,減少全域性的識別符號,從而限制使用者能否使用該類建立物件。這樣可以提高類的抽象能力,並且強調了兩個類(外圍類和巢狀類)之間的主從關係。
1 巢狀類對於外圍類:
1.巢狀類僅僅是宣告在外圍類內部的型別,而不是外圍類的成員
2.外圍類不具備巢狀類所定義的成員
3.對於外圍類來說,巢狀類和其他的類沒有任何區別;外圍類能訪問巢狀類物件的public成員,不能訪問巢狀類物件的protected及private成員
2 外圍類對於巢狀類:
1.巢狀類不具備外圍類所定義的成員
2.巢狀類能訪問外圍類的public成員,不能訪問外圍類的protected及private成員
3巢狀類對於外圍類外部的作用域:
1.無論巢狀類宣告為public、protected還是private,巢狀類對於外圍類任何成員可見
2.當巢狀類在外圍類中宣告為public時,對外圍類之外的作用域可見,外圍類之外的作用域可通過“::”訪問巢狀類;
相關說明
(1)類的私有成員只有類的成員和友元可以訪問,因此外圍類不可以訪問巢狀類的私有成員。巢狀類可以訪問外圍類的成員(通過物件、指標或者引用)。
(2)巢狀類既可為私有,也可為公有。在上面的例子中,巢狀類B的訪問許可權是public,可以在外圍類的成員函式之外使用該巢狀類,使用時加上名字限定。如果將巢狀類B的訪問許可權設定為private,那麼只能在外圍類內使用。
(3)巢狀類中的成員函式可以在它的類體外定義。
(4)巢狀類可以直接訪問外圍類的靜態成員、型別名( typedef )、列舉值。
以巢狀類對外圍類的靜態成員變數的訪問為例,訪問方式通過”ClassName::staticVarName”來直接訪問。