迭代器

维基百科,自由的百科全书
跳转至: 导航搜索

迭代器iterator)有時又稱游標(cursor)是程式設計的软件设计模式,可在容器物件(container,例如鏈表陣列)上遍訪的介面,設計人員無需關心容器物件的内存分配的实现细节。

各種語言實作迭代器的方式皆不盡同,有些物件導向語言像Java, C#, Ruby, Python, Delphi都已將迭代器的特性內建語言當中,完美的跟語言整合,我們稱之隱式迭代器(implicit iterator),但像是C++語言本身就沒有迭代器的特色,但STL仍利用模板實作了功能強大的迭代器。STL容器的數據的內存地址可能會重新分配(reallocate),與容器綁定的迭代器仍然可以定位到重新分配後的正確的內存地址。

迭代器另一方面還可以整合生成器(generator)。有些語言將二者視為同一介面,有些語言則將之獨立化。

範例[编辑]

C++[编辑]

C++STL可支持迭代器。

template<typename InputIterator>
void printall(InputIterator first, InputIterator last)
{
    for(; first != last; ++first)
    {
        std::cout << *first << std::endl;
    }
}

Java[编辑]

Java JDK 1.2 版開始支持迭代器。每一個迭代器提供next()以及hasNext()方法,同時也支持remove()。

Iterator iter = list.iterator();
//Iterator<MyType> iter = list.iterator();    in J2SE 5.0
while (iter.hasNext())
    System.out.println(iter.next());

Python[编辑]

在 Python 中,迭代器是遵循迭代協議的对象。使用 iter() 從任何序列对象中得到迭代器(如 list, tuple, dictionary, set 等)。另一種形式的输入迭代器是generator 。

要使得迭代器指向下一個元素,則使用成員函数next()(Python 2)或函數next()(Python 3) 。當沒有元素時,則引發 StopIteration异常。若要實现迭代器,則需要在类中定义next()(Python 2)或__next__()( Python 3)。

以下為兩個例子:

# 從序列得到
x = [42, "test", -12.34]
it = iter(x)
try:
  while True:
    x = next(it) # 在 Python 2 中,要改成 it.next()
    print(x)
except StopIteration:
  pass
 
# generator
def foo(n):
  for i in range(n):
    yield i
 
it = foo(5)
try:
  while True:
    x = next(it) # 在 Python 2 中,要改成 it.next()
    print(x)
except StopIteration:
  pass

Ruby[编辑]

Ruby程序員可以用yield關鍵字定義迭代器,又將迭代器和生成器分开。

0..42.each do |n|
 puts n
end

...以及...

for n in 0..42
 puts n
end

外部連結[编辑]

Wiktionary-logo-zh.png
维基词典上的词义解释: