1. 程式人生 > 實用技巧 >迭代器及巢狀類介紹

迭代器及巢狀類介紹

迭代器(iterator是一種物件,它能夠用來遍歷標準模板庫容器中的部分或全部元素,每個迭代器物件代表容器中的確定的地址。迭代器修改了常規指標的介面,所謂迭代器是一種概念上的抽象:那些行為上像迭代器的東西都可以叫做迭代器。然而迭代器有很多不同的能力,它可以把抽象容器和通用演算法有機的統一起來。

代器提供一些基本操作符:*++==!==。這些操作和C/C++“操作array元素時的指標介面一致。不同之處在於,迭代器是個所謂的複雜的指標,具有遍歷複雜資料結構的能力。其下層執行機制取決於其所遍歷的資料結構。因此,每一種容器型都必須提供自己的迭代器。事實上每一種容器都將其迭代器以巢狀的方式定義於內部。因此各種迭代器的介面相同,型號卻不同。這直接匯出了

泛型程式設計的概念:所有操作行為都使用相同介面,雖然它們的型別不同。

功能

迭代器使開發人員能夠在類或結構中支援foreach迭代,而不必整個實現IEnumerable或者IEnumerator介面。只需提供一個迭代器,即可遍歷類中的資料結構。當編譯器檢測到迭代器時,將自動生成IEnumerable介面或者IEnumerator介面的CurrentMoveNextDispose方法。

特點

1.迭代器是可以返回相同型別值的有序序列的一段程式碼;

2.迭代器可用作方法、運算子get訪問器的程式碼體;

3.迭代器程式碼使用yieldreturn語句依次返回每個元素,yield break

將終止迭代;

4.可以在類中實現多個迭代器,每個迭代器都必須像任何類成員一樣有惟一的名稱,並且可以在foreach語句中被客戶端,程式碼呼叫如下所示:foreach(int x in SimpleClass.Iterator2){}

5.迭代器的返回型別必須為IEnumerableIEnumerator中的任意一種;

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成員,不能訪問巢狀類物件的protectedprivate成員

2 外圍類對於巢狀類:

1.巢狀類不具備外圍類所定義的成員

2.巢狀類能訪問外圍類的public成員,不能訪問外圍類的protectedprivate成員

3巢狀類對於外圍類外部的作用域:

1.無論巢狀類宣告為publicprotected還是private,巢狀類對於外圍類任何成員可見

2.當巢狀類在外圍類中宣告為public時,對外圍類之外的作用域可見,外圍類之外的作用域可通過“::”訪問巢狀類;

相關說明

1)類的私有成員只有類的成員和友元可以訪問,因此外圍類不可以訪問巢狀類的私有成員。巢狀類可以訪問外圍類的成員(通過物件、指標或者引用)。

2)巢狀類既可為私有,也可為公有。在上面的例子中,巢狀類B的訪問許可權是public,可以在外圍類的成員函式之外使用該巢狀類,使用時加上名字限定。如果將巢狀類B的訪問許可權設定為private,那麼只能在外圍類內使用。

3)巢狀類中的成員函式可以在它的類體外定義。

4)巢狀類可以直接訪問外圍類的靜態成員、型別名( typedef )、列舉值。

以巢狀類對外圍類的靜態成員變數的訪問為例,訪問方式通過”ClassName::staticVarName”來直接訪問。