通過自定義迭代器的方式來研究集合的迭代方式

2021-08-14 11:23:30 字數 1745 閱讀 6626

1.自定義迭代器原始碼如下:

public class myiterator implements iterable, iterator

/*** 返回該資料的下乙個元素

*/public t next()

throw new nosuchelementexception("only " + data.length + " elements"); }

public static void main(string args) ;

myiteratormy = new myiterator(names);

iteratorit = my.iterator();//初始化便利深度為0;

while (it.hasnext())

} public myiterator(t data)

public void remove()

/*** 初始化便利深度引數,index;

*/public iteratoriterator()

}

2.iterable,iterator介面iterable 實現這個介面允許物件成為 "foreach" 語句的目標。

iterator iterator() 返回乙個在一組 t型別的元素上進行迭代的迭代器。

iterator 對 collection 進行迭代的迭代器。

boolean hasnext() 如果仍有元素可以迭代,則返回 true。

enext()返回迭代的下乙個元素。

void remove() 從迭代器指向的 collection 中移除迭代器返回的最後乙個元素(可選操作)。

3.集合架構:

4.collection為什麼一定要實現iterable介面,為什麼不直接實現iterator介面?

iterator介面的核心方法next()或者hasnext() 是依賴於迭代器的當前迭代位置的;如果collection直接實現iterator介面,則需引入乙個全域性的變數,如上述**中的index,用於標記迭代器當前的迭代位置;在多個迭代器迭代同一集合時,index會相互影響。

5.collection實體類是如何呼叫next()或者hasnext()方法的?

以arraylist為例進行研究如下:我們可以發現,在實現iterable介面的iterator()方法時,通過例項乙個實現iterator介面的內部類的方式來實現,從而保證多個迭代器迭代統一集合時,其迭代器位置引數cursor互不影響。

public iteratoriterator()
/**

* an optimized version of abstractlist.itr

*/private class itr implements iterator

@suppresswarnings("unchecked")

public e next()

public void remove() catch (indexoutofbound***ception ex)

}final void checkforcomodification()

}

C 自定義迭代器

讓我們在示例中看乙個簡單迭代器型別的定義。我們定義乙個類模板,用來表示一段數值型別值,也可以生成指定範圍的開始和結束迭代器。這個迭代器也是模板型別,兩個模板都定義在同乙個標頭檔案 numeric range.h 中。下面是 numeric range模板的定義 template class nume...

c 自定義迭代器練習

include include include include includeusing namespace std 第乙個型別引數可選的值為如下幾種 struct input iterator tag 唯讀 struct mutable iterator tag 只寫 struct output ...

C 自定義迭代器(STL)

一.iterator traits 迭代器萃取機 include template struct iterator traits 假如我們定義了乙個迭代器myiterator template void my swap iter a,iter b 當函式 以乙個迭代器為引數時,會出現這樣乙個尷尬,t...