Итератор (шаблон)

от Уикипедия, свободната енциклопедия
Направо към: навигация, търсене

Итератор (на английски: Iterator) е поведенчески шаблон за дизайн, който се използва в обектно-ориентираното програмиране. Итератора предоставя начин за последователен достъп до елементите на обект, без да е нужна вътрешна информация за обекта.В компютърно програмиране, итератор е обект, който дава възможност на програмиста да преминават през контейнер или списъци. Различни видове итератори често са предоставяни чрез интерфейс контейнер. Въпреки, че интерфейса и семантиката на даден итератор са фиксирани, итераторите често се прилагат по отношение на свързаните с тях структури изпълнение на контейнер и често са плътно свързани към контейнера, за да се даде възможност на оперативните семантиката на Итераторът. Имайте предвид, че итератор изпълнява (прекосява) и също така дава достъп до елементи от данни в контейнер, но не изпълнява итерация (т.е., не без значителна свобода взето с това понятие или с тривиално използване на терминологията). Итератор е поведенчески подобно на курсора на база данни.

Външни итератори и модела итератор[редактиране | редактиране на кода]

Генератори[редактиране | редактиране на кода]

Косвени Итератори[редактиране | редактиране на кода]

Потоци[редактиране | редактиране на кода]

Примери[редактиране | редактиране на кода]

C++[редактиране | редактиране на кода]

C#[редактиране | редактиране на кода]

Java[редактиране | редактиране на кода]

PHP
PHP 4 въведе foreach конструкцията, подобно на Perl и някои други езици. Това просто дава лесен начин за обхождане на масиви. foreach работи само върху масиви в PHP 4, и ще изведе грешка, когато се опитате да го използвате на променлива с различен тип данни или неинициализирана променлива. В PHP 5, foreach е позволено за итериране върху обект през всички публични членове.

Има два синтаксиса; Вторият е незначително, но полезно разширение на първият.

Пример A

foreach (array_expression as $value) {     echo "$value\n"; }

Пример Б

foreach (array_expression as $key => $value) {     echo "($key)$value\n"; }

В Пример А циклим върху масива обозначен с array_expression. На всяко завъртане на цикъла стойността на текущият елемент се записва в $value и вътрешният указател на масива се увеличава с единица (така, че при следващо завъртане на цикъла ще гледа към следващият елемент).

В Пример Б имаме същата функционалност като в Пример А. В допълнение текущият ключ на елемента (в нашият случай array_expression) ще бъде записан в променливата $key при всяко завъртане на цикъла.

Интерфейсът на итератора е предефиниран в PHP 5 и обектите могат да бъдат персонализирани, за да се справят с итерацията.

class MyIterator implements Iterator {     private $var = array();

    public function __construct($array) {         if (is_array($array)) { $this->var = $array;         }     }

    public function rewind() {         echo "rewinding\n";         reset($this->var);     }

    public function current() {         $var = current($this->var);         echo "current: $var\n";         return $var;     }

    public function key() {         $var = key($this->var);         echo "key: $var\n";         return $var;     }

    public function next() {         $var = next($this->var);         echo "next: $var\n";         return $var;     }

    public function valid() {         $var = $this->current() !== false;         echo "valid: {$var}\n";         return $var;     } }

Тези методи биват използвани в пълна foreach($obj AS $key=>$value)последователност. Методите на итераторите се изпълняват в следният ред:

1. rewind() 2. while valid() {        2.1 current() in $value        2.3 key() in $key        2.4 next()       }

SCALA[редактиране | редактиране на кода]

В Scala, итератори имат богат набор от методи, подобни на колекции, и могат да бъдат използвани директно в for цикли.Всъщност, както итераторите, така и колекциите наследяват от общите черти на - scala.collection.TraversableOnce. Въпреки това, заради богатият набор от методи , които съществуват в Scala колекциите, като например map, collect, filter и т.н., то не се налага често да се справяме с итератори директно при програмирането в Scala.

Java итератори и колекции могат автоматично да бъдат превърнати в Scala итератори и колекции, просто чрез добавяне на един единствен ред

import scala.collection.JavaConversions._

към файла.Обектът JavaConversions осигурява имплицитни превръщания. Косвените преобразувания са характерни за Scala: методи, които, когато са видими в текущия обхват, автоматично се извикват в най-подходящото място, за да се typecheck-нат когато те иначе не биха.

Python

Итераторите в Python са основна част от езика, а и в много случаи са невидими тъй като по презумпция се използва в for (foreach) декларация, в list comprehensions, и в generator expressions. Всички стандартно вградени видове колекции в Пайтън поддържат итерация, както и много класове, които са част от стандартната библиотека. Следващият пример показва типична имплицитна итерация върху последователност:

for value in sequence:

print (value)

Python речниците (форма на асоциативен масив) също могат да бъдат директно итерирани, когато ключовете на речника се връщат; или метода items на речник може да се итерира отново, където той получава съответната ключ, стойност двойка като кортеж:

for key in dictionary:
    value = dictionary[key]
    print(key, value)
for key, value in dictionary.items():
    print(key, value)

Итераторите могат да се използват и дефинират изрично. За всеки тип итерираща последователност или клас, вградената функция iter () се използва за създаване на итератор обект. Итериращият обект може след това да се итерира със функцията next(), която използва вътрешно метода __next __ () , който връща следващия елемент в контейнера. (Предишното изявление се отнася за Python 3.x. В Python 2.x, метода next() е еквивалентен.). Ще възникне StopIteration exception, когато не са останали повече елементи. Следващият пример показва еквивалентна итерация върху последователност използвайки експлицитни итератори:

it = iter(sequence)
while True:
    try:
        value = it.next() # in Python 2.x
        value = next(it) # in Python 3.x
    except StopIteration:
        break
    it = iter(it)
    print(value)