AlgStr / Библиотека / POSIBNIK / Итераторы
.docИТЕРАТОРЫ
Итератор - абстракция, скрывающая подробности перебора элементов какой-то структуры данных.
Итератор осуществляет перебор компонентов множественного набора данных, удобным и эффективным способом и при этом не нарушает абстракцию через спецификацию.
Итератор выдает результаты не все целиком, а поочередно.
Итератор используется в следующих конструкциях:
for each <для элемента i, возвращаемого итератором А>
do <<выполнить над i некоторое действие D>>
Итератор позволяет разделить действия использования элемента. Он позволяет решить проблемы экономии памяти и времени.
Спецификация итератора:
iname=iter (<аргументы>) gields (<результаты>)
signals (<результаты, возвращаемые по исключительной ситуации>)
Пример. Вычислить сумму элементов множества целых чисел S (на базе массива неповторяющихся элементов)
elements=iter (S:intset) gields(int)
requires S не модифицируется в теле цикла
effects выдает элементы S в некотором произвольном порядке, причем каждый элемент
только один раэ
rep=array[int]
elements=iter(S:int) gields (int)
i:int=rep $ low(s) - нижняя граница индекса массива
while true do
gield(S[i])
except when bounds:returns end
i:=i+1
end
end elements
setsum=proc (S:intset) returns(int)
Sum:int:=0
for el:int in intset $ elements(S)do
Sum:=Sum+el
end for
return (Sum)
end SetSum
intset=cluster is ... elements...
Итераторов для одного типа может быть несколько. Итераторы могут использоваться как фильтры.
Встроенные итераторы языка CLU
from to=iter(x,y:int) gields(int)
effects выдает целые числа между x и y включительно в порядке следования.
filter=iter(S:intset) gields (int)
predicate:proctype(int) returns(bool)
for el:int in elements(S) do
if predicate(el) then
gield(el)
end if
end for
end filter
filter(S, intset $ elements, odd) -выдает только нечетные элементы
****************************************************************************************************