计算机科学

首页 > 计算机科学

迭代器

2018-08-31 10:20:47     所属分类:面向对象的程序设计

迭代器iterator)有时又称游标(cursor)是程式设计的软件设计模式,可在容器物件(container,例如链表或阵列)上遍访的界面,设计人员无需关心容器物件的内存分配的实现细节。

各种语言实作迭代器的方式皆不尽同,有些面向对象语言像Java, C#, Ruby, Python, Delphi都已将迭代器的特性内建语言当中,完美的跟语言整合,我们称之隐式迭代器(implicit iterator),但像是C++语言本身就没有迭代器的特色,但STL仍利用模板实作了功能强大的迭代器。STL容器的数据的内存地址可能会重新分配(reallocate),与容器绑定的迭代器仍然可以定位到重新分配后的正确的内存地址。

迭代器另一方面还可以整合生成器(generator)。有些语言将二者视为同一界面,有些语言则将之独立化。

目录

  • 1 范例
    • 1.1 C♯
    • 1.2 C++
    • 1.3 Java
    • 1.4 Python
    • 1.5 Ruby
  • 2 参见
  • 3 外部链接

范例

C♯

一种新形式的迭代器它提供了函数语言程式设计中的generator,使用yield return

类似于Python中使用的yield

// Method that takes an iterable input (possibly an array)
// and returns all even numbers.
public static IEnumerable<int> GetEven(IEnumerable<int> numbers)
{
    foreach(int i in numbers)
    {
        if (i % 2 == 0) yield return i;
    }
}

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

参见

C♯

外部链接

  • Article "Understanding and Using Iterators" by Joshua Gatcomb
  • Article "A Technique for Generic Iteration and Its Optimization" (217 KB) by Stephen M. Watt
  • Overview of the Standard Template Library
  • STL Iterators
  • What are iterators? - Reference description
  • Java interface
  • Template reference
  • Boost C++ Iterator Library
  • PHP: Object Iteration

相关推荐