У комп'ютерному програмуванні ітератор — це об'єкт, який дозволяє програмісту обходити елементи колекції, зокрема списку. Різні типи ітераторів часто вже є доступними через інтерфейс колекції. Хоча інтерфейс і семантика конкретного ітератора є фіксованими, ітератори часто реалізуються в термінах структур, які лежать в основі реалізації колекції, і часто тісно пов'язані з колекцією, щоб забезпечити робочу семантику ітератора. Ітератор виконує обхід, а також надає доступ до елементів даних у колекції, але сам не виконує ітерації.
Поведінка ітератора схожа на курсор бази даних. Ітератори вперше з'явилися в мові програмування CLU в 1974 році.
Опис
Внутрішні ітератори
Внутрішні ітератори — це функції вищого порядку (часто приймають анонімні функції, але не обов'язково), такі як map()
, reduce()
тощо, які реалізують обхід колекції, застосовуючи дану функцію до кожного елемента по черзі. Прикладом може бути функція map
Python:
digits = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] squared_digits = map(lambda x: x**2, digits) # Ітерація по цьому ітератору дає послідовність 0, 1, 4, 9, 16, ..., 81.
Зовнішні ітератори та шаблон ітератора
Зовнішній ітератор можна розглядати як тип вказівника, який виконує дві основні операції: посилання на один окремий елемент у колекції об'єктів (так званий доступ до елемента) і модифікація себе таким способом, щоб він вказував на наступний елемент (так званий обхід елементів). Також має бути спосіб створити ітератор, щоб він вказував на деякий перший елемент, а також якийсь спосіб визначити, коли ітератор вичерпає всі елементи в колекції. Залежно від мови та намірів використання ітератори також можуть забезпечувати додаткові операції або демонструвати різну поведінку.
Основна мета ітератора — дозволити користувачеві обробляти кожен елемент колекції, при цьому ізолюючи користувача від внутрішньої структури колекції. Це дозволяє колекції зберігати елементи довільним способом та дозволяє користувачеві розглядати їх так, ніби це проста послідовність або список. Клас ітератора зазвичай розробляється в тісній координації з відповідним класом-колекцією. Зазвичай колекція надає методи для створення ітераторів.
Лічильник циклу іноді також називають ітератором циклу. Однак лічильник циклів забезпечує лише функціональні можливості обходу, а не функції доступу до елементу.
Генератори
Одним із способів реалізації ітераторів є використання обмеженої форми співпрограми, відомої як генератор. На відміну від підпрограми, співпрограма генератора може надавати (yield) значення при виклику декілька разів замість того, щоб повертати його лише один раз. Більшість ітераторів природно виражаються як генератори, але оскільки генератори зберігають свій локальний стан між викликами, вони особливо добре підходять для складних ітераторів із збереженням стану, таких як обходи дерев. Існують тонкі відмінності у використанні термінів «генератор» та «ітератор», які відрізняються залежно від автора та мови. У Python генератор — це конструктор ітератора: функція, яка повертає ітератор. Нижче наведено приклад генератора Python, який повертає ітератор для чисел Фібоначчі за допомогою оператора yield
Python:
def fibonacci(limit): a, b = 0, 1 for _ in range(limit): yield a a, b = b, a + b for number in fibonacci(100): # Генератор створює ітератор print(number)
Неявні ітератори
Деякі об'єктно-орієнтовані мови, такі як C#, (пізніші версії), Delphi (пізніші версії), Go, Java (пізніші версії), Lua, Perl, Python, Ruby, забезпечують [en] спосіб ітерації елементів об'єкта-колекції без введення явного об'єкта-ітератора. Фактичний об'єкт-ітератор може існувати в реальності, але якщо він існує, він не відображається у вихідному коді мови.
Неявні ітератори часто проявляються оператором «foreach» (або еквівалентом), наприклад, у наступному прикладі Python: У Python ітератор — це об'єкт, який можна перетворити на ітератор, який потім ітерується під час циклу for; це робиться неявно:
for value in iterable: print(value)
Або в інших випадках вони можуть бути створені самим об'єктом колекції, як у цьому прикладі Ruby: Цей стиль ітерації іноді називають «вбудованою ітерацією», оскільки його код повністю виконується в контексті ітерованого об'єкта (який контролює всі аспекти ітерації), а програміст надає лише операцію для виконання на кожному кроці (використовуючи анонімну функцію).
iterable.each do |value| puts value end
Мови, які підтримують спискові вирази або подібні конструкції, також можуть використовувати неявні ітератори під час створення списку результатів, як у Python:
names = [person.name for person in roster if person.male]
Іноді неявна прихована природа є лише частковою. У мові є кілька шаблонів функцій для неявної ітерації, наприклад for_each()
. Ці функції все ще вимагають явних об'єктів ітератора як початкового входу, але наступна ітерація не відкриває об'єкт ітератора для користувача.
Потоки
Ітератори є корисною абстракцією вхідних потоків — вони надають потенційно нескінченний ітерований (але не обов'язково індексований) об'єкт. Деякі мови, такі як Perl і Python, реалізують потоки як ітератори. У Python ітератори — це об'єкти, що представляють потоки даних. Альтернативні реалізації потоку включають мови, [en], такі як AWK і sed.
Відмінності від індексації
У процедурних мовах зазвичай використовують оператор індексу та лічильник циклу для проходження всіх елементів послідовності, такої як масив. Хоча індексування також може використовуватися з деякими об'єктно-орієнтованими колекціями, використання ітераторів може мати деякі переваги:
- Цикли підрахунку не підходять для всіх структур даних, зокрема для структур даних без довільного доступу або з повільним довільним доступом, таких як списки або дерева.
- Ітератори можуть забезпечити послідовний спосіб ітерації структур даних усіх типів і, отже, зробити код більш читабельним, придатним для повторного використання та менш чутливим до змін у структурі даних.
- Ітератор може накладати додаткові обмеження на доступ, наприклад гарантувати, що елементи не можуть бути пропущені або що раніше відвіданий елемент не може бути доступний другий раз.
- Ітератор може дозволити змінювати об'єкт-колекція, не пошкоджуючи ітератор. Наприклад, як тільки ітератор вийшов за межі першого елемента, можна було б вставити додаткові елементи на початок колекції з передбачуваними результатами. При використанні індексації це проблематично зробити, оскільки номери індексів повинні змінюватися.
Здатність колекції модифікуватися під час ітерації його елементів стала необхідною в сучасному об'єктно-орієнтованому програмуванні, де взаємозв'язки між об'єктами та наслідками операцій можуть бути неочевидними. Використовуючи ітератор, ви убезпечені від таких наслідків. Однак, до цього твердження варто ставитися з недовірою, тому що, частіше за все, з міркувань ефективності, реалізація ітератора настільки тісно прив'язана до колекції, що може перешкоджати модифікації основної колекції, щоб не пошкодити себе.
Для колекцій, які можуть переміщувати свої дані в пам'яті, єдиний спосіб не пошкодити ітератор — колекція має якимось чином відстежувати всі активні ітератори та оновлювати їх на льоту. Оскільки кількість ітераторів у певний момент часу може бути як завгодно великою порівняно з розміром зв'язаної колекції, їх одночасне оновлення різко погіршить гарантію складності операцій колекції.
Альтернативним способом збереження кількості оновлень, прив'язаних до розміру колекції, було б використання свого роду механізму ручки, тобто набору непрямих покажчиків на елементи колекції, які потрібно оновлювати разом із колекцією, і дозволити ітераторам вказувати на ці непрямі покажчикі замість того, щоб вказати безпосередньо на елементи даних. Але такий підхід негативно вплине на продуктивність ітератора, оскільки для доступу до фактичного елемента даних він повинен використовувати подвійний вказівник. Зазвичай це небажано, тому що багато алгоритмів, що використовують ітератори, викликають операцію доступу до даних ітераторів частіше, ніж попередній метод. Тому особливо важливо мати ітератори з дуже ефективним доступом до даних.
Загалом, це завжди компроміс між безпекою (ітератори залишаються завжди робочими) та ефективністю. У більшості випадків додаткова безпека не вартує тієї ціни ефективності, яку потрібно за неї заплатити. Використання альтернативної колекції (наприклад, однозв'язаного списку замість вектора) було б кращим вибором (глобально ефективнішим), якщо потрібна стабільність ітераторів.
Класифікація ітераторів
Категорії ітераторів
Ітератори можна класифікувати відповідно до їхньої функціональності. Ось (неповний) список категорій ітераторів:
Категорія | Мова |
---|---|
Bidirectional iterator | |
Forward iterator | C++ |
Input iterator | C++ |
Output iterator | C++ |
Random access iterator | C++ |
Trivial iterator | C++ (старий STL) |
Типи ітераторів
Різні мови або бібліотеки, що використовуються з цими мовами, визначають типи ітераторів. Деякі з них
Тип | Мова |
---|---|
Array iterator | PHP, R |
Caching iterator | PHP |
Constant iterator | , PHP |
Directory iterator | PHP, Python |
Filter iterator | PHP, R |
Limit iterator | PHP |
List iterator | Java, R |
Recursive array iterator | PHP |
XML iterator | PHP |
У мовах програмування
Python
Ітератори в Python є фундаментальною частиною мови і в багатьох випадках залишаються непоміченими, оскільки вони неявно використовуються в операторі for
(foreach), у списках і у виразах генератора. Усі стандартні вбудовані типи колекцій Python підтримують ітерацію, а також багато класів, які є частиною стандартної бібліотеки. У наступному прикладі показано типову неявну ітерацію по послідовності:
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
буде викликано, коли більше не залишиться елементів. У наступному прикладі показано еквівалентну ітерацію в послідовності з використанням явних ітераторів:
it = iter(sequence) while True: try: value = it.next() # in Python 2.x value = next(it) # in Python 3.x except StopIteration: break print(value)
Будь-який визначений користувачем клас може підтримувати стандартну ітерацію (неявну або явну) шляхом визначення методу __iter__()
, який повертає об'єкт ітератора. Потім об'єкт-ітератор повинен визначити метод __next__()
, який повертає наступний елемент.
Генератори Python реалізують цей протокол ітерації.
Див. також
- [en], у якому замість того, щоб розробник повторно викликав ітератор для отримання нових значень,
iteratee
викликається неодноразово для обробки нових фрагментів даних — приклад інверсії керування. - Шаблони проєктування програмного забезпечення
- Ітерація
- Шаблон ітератора
- Діапазон
- Шаблон відвідувача
- Вказівник
Примітки
- Gatcomb, Joshua. . Perl.com. Архів оригіналу за 6 серпня 2012. Процитовано 8 серпня 2012.
A user-defined iterator usually takes the form of a code reference that, when executed, calculates the next item in a list and returns it. When the iterator reaches the end of the list, it returns an agreed-upon value.
- Watt, Stephen M. . The University of Western Ontario, Department of Computer Science. Архів оригіналу (PDF) за 6 серпня 2012. Процитовано 8 серпня 2012.
Iterators were introduced as constructs to allow looping over abstract data structures without revealing their internal representation.
{{}}
: Недійсний|url-status=unknown
() - Alex Allain. STL Iterators. Cprogramming.com - Your resource for C and C++. Процитовано 8 серпня 2012.
You can think of an iterator as pointing to an item that is part of a larger container of items.
- Liskov, Barbara (1992). «A history of CLU». The second ACM SIGPLAN conference on History of programming languages.
- . CareerRide.COM. 3 квітня 2009. Архів оригіналу за 19 вересня 2012. Процитовано 8 серпня 2012.
An internal iterator is implemented by the member functions of the class which has the iteration logic. An external iterator is implemented by a separate class which can be attached to the object which has iteration logic. The advantage of external iterator is that, many iterators can be made active simultaneously on the existing or same object.
{{}}
: Недійсний|url-status=unknown
() - Watt, Stephen M. . The University of Western Ontario, Department of Computer Science. Архів оригіналу (PDF) за 6 серпня 2012. Процитовано 8 серпня 2012.
Some authors use the term iterator, and others the term generator. Some make subtle distinctions between the two.
{{}}
: Недійсний|url-status=unknown
() - Freeman, Eric; Freeman, Elisabeth; Kathy, Sierra; Bert, Bates (2004). Hendrickson, Mike; Loukides, Mike (ред.). Head First Design Patterns (paperback). Т. 1. O'REILLY. с. 338. ISBN . Процитовано 9 серпня 2012.
- Glossary — Python 3.8.4 documentation. Процитовано 15 липня 2020.
- Vecerina, Ivan (1 лютого 2006). . BYTES. Архів оригіналу за 9 серпня 2012. Процитовано 8 серпня 2012.
An index only can be used for containers that (efficiently) support random access (i.e. direct access to an element at a given position). An iterator is a more general concept. Iterators offer efficient traversal of linked lists, files, and a number of other data structures. It often leads to the generation of more efficient code.
{{}}
: Недійсний|url-status=unknown
() - Kevin Waterson. C++ Iteratoren: Iterator-Kategorien (нім.). cppreference.com. Процитовано 9 серпня 2012.
- Kevin Waterson. Iterators: Concepts. sgi. Процитовано 9 серпня 2012.
- larsmans (6 березня 2011). . stackoverflow. Архів оригіналу за 8 серпня 2012. Процитовано 9 серпня 2012.
{{}}
: Недійсний|url-status=unknown
() - Kevin Waterson. Introduction to SPL: Introduction to Standard PHP Library (SPL). PHPRO.ORG. Процитовано 9 серпня 2012.
- Collier, Andrew. . Архів оригіналу за 18 жовтня 2018. Процитовано 16 листопада 2013.
- . Intel Threading Building Blocks for Open Source. Архів оригіналу за 1 травня 2015. Процитовано 9 серпня 2012.
The iterator types iterator and const_iterator are of the forward iterator category
Посилання
- Java's Iterator, Iterable and ListIterator Explained (англ.)
- .NET interface (англ.)
- Стаття «Understanding and Using Iterators» Джошуа Гаткомба (англ.)
- Стаття «A Technique for Generic Iteration and Its Optimization» [en] (англ.)
- Iterators (англ.)
- Boost C++ Iterator Library (англ.)
- Java interface (англ.)
- PHP: Object Iteration (англ.)
- STL Iterators (англ.)
- What are iterators? — Reference description (англ.)
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
U Vikipediyi ye statti pro inshi znachennya cogo termina Iterator znachennya U komp yuternomu programuvanni iterator ce ob yekt yakij dozvolyaye programistu obhoditi elementi kolekciyi zokrema spisku Rizni tipi iteratoriv chasto vzhe ye dostupnimi cherez interfejs kolekciyi Hocha interfejs i semantika konkretnogo iteratora ye fiksovanimi iteratori chasto realizuyutsya v terminah struktur yaki lezhat v osnovi realizaciyi kolekciyi i chasto tisno pov yazani z kolekciyeyu shob zabezpechiti robochu semantiku iteratora Iterator vikonuye obhid a takozh nadaye dostup do elementiv danih u kolekciyi ale sam ne vikonuye iteraciyi Povedinka iteratora shozha na kursor bazi danih Iteratori vpershe z yavilisya v movi programuvannya CLU v 1974 roci OpisVnutrishni iteratori Vnutrishni iteratori ce funkciyi vishogo poryadku chasto prijmayut anonimni funkciyi ale ne obov yazkovo taki yak map reduce tosho yaki realizuyut obhid kolekciyi zastosovuyuchi danu funkciyu do kozhnogo elementa po cherzi Prikladom mozhe buti funkciya map Python digits 0 1 2 3 4 5 6 7 8 9 squared digits map lambda x x 2 digits Iteraciya po comu iteratoru daye poslidovnist 0 1 4 9 16 81 Zovnishni iteratori ta shablon iteratora Zovnishnij iterator mozhna rozglyadati yak tip vkazivnika yakij vikonuye dvi osnovni operaciyi posilannya na odin okremij element u kolekciyi ob yektiv tak zvanij dostup do elementa i modifikaciya sebe takim sposobom shob vin vkazuvav na nastupnij element tak zvanij obhid elementiv Takozh maye buti sposib stvoriti iterator shob vin vkazuvav na deyakij pershij element a takozh yakijs sposib viznachiti koli iterator vicherpaye vsi elementi v kolekciyi Zalezhno vid movi ta namiriv vikoristannya iteratori takozh mozhut zabezpechuvati dodatkovi operaciyi abo demonstruvati riznu povedinku Osnovna meta iteratora dozvoliti koristuvachevi obroblyati kozhen element kolekciyi pri comu izolyuyuchi koristuvacha vid vnutrishnoyi strukturi kolekciyi Ce dozvolyaye kolekciyi zberigati elementi dovilnim sposobom ta dozvolyaye koristuvachevi rozglyadati yih tak nibi ce prosta poslidovnist abo spisok Klas iteratora zazvichaj rozroblyayetsya v tisnij koordinaciyi z vidpovidnim klasom kolekciyeyu Zazvichaj kolekciya nadaye metodi dlya stvorennya iteratoriv Lichilnik ciklu inodi takozh nazivayut iteratorom ciklu Odnak lichilnik cikliv zabezpechuye lishe funkcionalni mozhlivosti obhodu a ne funkciyi dostupu do elementu Generatori Odnim iz sposobiv realizaciyi iteratoriv ye vikoristannya obmezhenoyi formi spivprogrami vidomoyi yak generator Na vidminu vid pidprogrami spivprograma generatora mozhe nadavati yield znachennya pri vikliku dekilka raziv zamist togo shob povertati jogo lishe odin raz Bilshist iteratoriv prirodno virazhayutsya yak generatori ale oskilki generatori zberigayut svij lokalnij stan mizh viklikami voni osoblivo dobre pidhodyat dlya skladnih iteratoriv iz zberezhennyam stanu takih yak obhodi derev Isnuyut tonki vidminnosti u vikoristanni terminiv generator ta iterator yaki vidriznyayutsya zalezhno vid avtora ta movi U Python generator ce konstruktor iteratora funkciya yaka povertaye iterator Nizhche navedeno priklad generatora Python yakij povertaye iterator dlya chisel Fibonachchi za dopomogoyu operatora yield Python def fibonacci limit a b 0 1 for in range limit yield a a b b a b for number in fibonacci 100 Generator stvoryuye iterator print number Neyavni iteratori Deyaki ob yektno oriyentovani movi taki yak C C piznishi versiyi Delphi piznishi versiyi Go Java piznishi versiyi Lua Perl Python Ruby zabezpechuyut en sposib iteraciyi elementiv ob yekta kolekciyi bez vvedennya yavnogo ob yekta iteratora Faktichnij ob yekt iterator mozhe isnuvati v realnosti ale yaksho vin isnuye vin ne vidobrazhayetsya u vihidnomu kodi movi Neyavni iteratori chasto proyavlyayutsya operatorom foreach abo ekvivalentom napriklad u nastupnomu prikladi Python U Python iterator ce ob yekt yakij mozhna peretvoriti na iterator yakij potim iteruyetsya pid chas ciklu for ce robitsya neyavno for value in iterable print value Abo v inshih vipadkah voni mozhut buti stvoreni samim ob yektom kolekciyi yak u comu prikladi Ruby Cej stil iteraciyi inodi nazivayut vbudovanoyu iteraciyeyu oskilki jogo kod povnistyu vikonuyetsya v konteksti iterovanogo ob yekta yakij kontrolyuye vsi aspekti iteraciyi a programist nadaye lishe operaciyu dlya vikonannya na kozhnomu kroci vikoristovuyuchi anonimnu funkciyu iterable each do value puts value end Movi yaki pidtrimuyut spiskovi virazi abo podibni konstrukciyi takozh mozhut vikoristovuvati neyavni iteratori pid chas stvorennya spisku rezultativ yak u Python names person name for person in roster if person male Inodi neyavna prihovana priroda ye lishe chastkovoyu U movi C ye kilka shabloniv funkcij dlya neyavnoyi iteraciyi napriklad for each Ci funkciyi vse she vimagayut yavnih ob yektiv iteratora yak pochatkovogo vhodu ale nastupna iteraciya ne vidkrivaye ob yekt iteratora dlya koristuvacha Potoki Iteratori ye korisnoyu abstrakciyeyu vhidnih potokiv voni nadayut potencijno neskinchennij iterovanij ale ne obov yazkovo indeksovanij ob yekt Deyaki movi taki yak Perl i Python realizuyut potoki yak iteratori U Python iteratori ce ob yekti sho predstavlyayut potoki danih Alternativni realizaciyi potoku vklyuchayut movi en taki yak AWK i sed Vidminnosti vid indeksaciyi U procedurnih movah zazvichaj vikoristovuyut operator indeksu ta lichilnik ciklu dlya prohodzhennya vsih elementiv poslidovnosti takoyi yak masiv Hocha indeksuvannya takozh mozhe vikoristovuvatisya z deyakimi ob yektno oriyentovanimi kolekciyami vikoristannya iteratoriv mozhe mati deyaki perevagi Cikli pidrahunku ne pidhodyat dlya vsih struktur danih zokrema dlya struktur danih bez dovilnogo dostupu abo z povilnim dovilnim dostupom takih yak spiski abo dereva Iteratori mozhut zabezpechiti poslidovnij sposib iteraciyi struktur danih usih tipiv i otzhe zrobiti kod bilsh chitabelnim pridatnim dlya povtornogo vikoristannya ta mensh chutlivim do zmin u strukturi danih Iterator mozhe nakladati dodatkovi obmezhennya na dostup napriklad garantuvati sho elementi ne mozhut buti propusheni abo sho ranishe vidvidanij element ne mozhe buti dostupnij drugij raz Iterator mozhe dozvoliti zminyuvati ob yekt kolekciya ne poshkodzhuyuchi iterator Napriklad yak tilki iterator vijshov za mezhi pershogo elementa mozhna bulo b vstaviti dodatkovi elementi na pochatok kolekciyi z peredbachuvanimi rezultatami Pri vikoristanni indeksaciyi ce problematichno zrobiti oskilki nomeri indeksiv povinni zminyuvatisya Zdatnist kolekciyi modifikuvatisya pid chas iteraciyi jogo elementiv stala neobhidnoyu v suchasnomu ob yektno oriyentovanomu programuvanni de vzayemozv yazki mizh ob yektami ta naslidkami operacij mozhut buti neochevidnimi Vikoristovuyuchi iterator vi ubezpecheni vid takih naslidkiv Odnak do cogo tverdzhennya varto stavitisya z nedoviroyu tomu sho chastishe za vse z mirkuvan efektivnosti realizaciya iteratora nastilki tisno priv yazana do kolekciyi sho mozhe pereshkodzhati modifikaciyi osnovnoyi kolekciyi shob ne poshkoditi sebe Dlya kolekcij yaki mozhut peremishuvati svoyi dani v pam yati yedinij sposib ne poshkoditi iterator kolekciya maye yakimos chinom vidstezhuvati vsi aktivni iteratori ta onovlyuvati yih na lotu Oskilki kilkist iteratoriv u pevnij moment chasu mozhe buti yak zavgodno velikoyu porivnyano z rozmirom zv yazanoyi kolekciyi yih odnochasne onovlennya rizko pogirshit garantiyu skladnosti operacij kolekciyi Alternativnim sposobom zberezhennya kilkosti onovlen priv yazanih do rozmiru kolekciyi bulo b vikoristannya svogo rodu mehanizmu ruchki tobto naboru nepryamih pokazhchikiv na elementi kolekciyi yaki potribno onovlyuvati razom iz kolekciyeyu i dozvoliti iteratoram vkazuvati na ci nepryami pokazhchiki zamist togo shob vkazati bezposeredno na elementi danih Ale takij pidhid negativno vpline na produktivnist iteratora oskilki dlya dostupu do faktichnogo elementa danih vin povinen vikoristovuvati podvijnij vkazivnik Zazvichaj ce nebazhano tomu sho bagato algoritmiv sho vikoristovuyut iteratori viklikayut operaciyu dostupu do danih iteratoriv chastishe nizh poperednij metod Tomu osoblivo vazhlivo mati iteratori z duzhe efektivnim dostupom do danih Zagalom ce zavzhdi kompromis mizh bezpekoyu iteratori zalishayutsya zavzhdi robochimi ta efektivnistyu U bilshosti vipadkiv dodatkova bezpeka ne vartuye tiyeyi cini efektivnosti yaku potribno za neyi zaplatiti Vikoristannya alternativnoyi kolekciyi napriklad odnozv yazanogo spisku zamist vektora bulo b krashim viborom globalno efektivnishim yaksho potribna stabilnist iteratoriv Klasifikaciya iteratoriv Kategoriyi iteratoriv Iteratori mozhna klasifikuvati vidpovidno do yihnoyi funkcionalnosti Os nepovnij spisok kategorij iteratoriv Kategoriya Mova Bidirectional iterator C Forward iterator C Input iterator C Output iterator C Random access iterator C Trivial iterator C starij STL Tipi iteratoriv Rizni movi abo biblioteki sho vikoristovuyutsya z cimi movami viznachayut tipi iteratoriv Deyaki z nih Tip Mova Array iterator PHP R Caching iterator PHP Constant iterator C PHP Directory iterator PHP Python Filter iterator PHP R Limit iterator PHP List iterator Java R Recursive array iterator PHP XML iterator PHPU movah programuvannyaPython Iteratori v Python ye fundamentalnoyu chastinoyu movi i v bagatoh vipadkah zalishayutsya nepomichenimi oskilki voni neyavno vikoristovuyutsya v operatori for foreach u spiskah i u virazah generatora Usi standartni vbudovani tipi kolekcij Python pidtrimuyut iteraciyu a takozh bagato klasiv yaki ye chastinoyu standartnoyi biblioteki U nastupnomu prikladi pokazano tipovu neyavnu iteraciyu po poslidovnosti for value in sequence print value Slovniki Python forma asociativnogo masivu takozh mozhna bezposeredno perebirati koli povertayutsya klyuchi slovnika abo metod items slovnika mozhna povtoriti de vin daye vidpovidni pari klyuch znachennya yak kortezh for key in dictionary value dictionary key print key value for key value in dictionary items print key value Odnak iteratori mozhna vikoristovuvati ta viznachati yavno Dlya bud yakogo iterovanogo tipu poslidovnosti abo klasu vbudovana funkciya iter vikoristovuyetsya dlya stvorennya ob yekta iteratora Potim ob yekt iteratora mozhna povtoriti za dopomogoyu funkciyi next yaka vikoristovuye vnutrishnij metod next yakij povertaye nastupnij element u kolekciyi Poperednye tverdzhennya stosuyetsya Python 3 x U Python 2 x vikoristovuyetsya ekvivalentnij metod next Vinyatok StopIteration bude viklikano koli bilshe ne zalishitsya elementiv U nastupnomu prikladi pokazano ekvivalentnu iteraciyu v poslidovnosti z vikoristannyam yavnih iteratoriv it iter sequence while True try value it next in Python 2 x value next it in Python 3 x except StopIteration break print value Bud yakij viznachenij koristuvachem klas mozhe pidtrimuvati standartnu iteraciyu neyavnu abo yavnu shlyahom viznachennya metodu iter yakij povertaye ob yekt iteratora Potim ob yekt iterator povinen viznachiti metod next yakij povertaye nastupnij element Generatori Python realizuyut cej protokol iteraciyi Div takozh en u yakomu zamist togo shob rozrobnik povtorno viklikav iterator dlya otrimannya novih znachen iteratee viklikayetsya neodnorazovo dlya obrobki novih fragmentiv danih priklad inversiyi keruvannya Shabloni proyektuvannya programnogo zabezpechennya Iteraciya Shablon iteratora Diapazon Shablon vidviduvacha VkazivnikPrimitkiGatcomb Joshua Perl com Arhiv originalu za 6 serpnya 2012 Procitovano 8 serpnya 2012 A user defined iterator usually takes the form of a code reference that when executed calculates the next item in a list and returns it When the iterator reaches the end of the list it returns an agreed upon value Watt Stephen M The University of Western Ontario Department of Computer Science Arhiv originalu PDF za 6 serpnya 2012 Procitovano 8 serpnya 2012 Iterators were introduced as constructs to allow looping over abstract data structures without revealing their internal representation a href wiki D0 A8 D0 B0 D0 B1 D0 BB D0 BE D0 BD Cite web title Shablon Cite web cite web a Nedijsnij url status unknown dovidka Alex Allain STL Iterators Cprogramming com Your resource for C and C Procitovano 8 serpnya 2012 You can think of an iterator as pointing to an item that is part of a larger container of items Liskov Barbara 1992 A history of CLU The second ACM SIGPLAN conference on History of programming languages CareerRide COM 3 kvitnya 2009 Arhiv originalu za 19 veresnya 2012 Procitovano 8 serpnya 2012 An internal iterator is implemented by the member functions of the class which has the iteration logic An external iterator is implemented by a separate class which can be attached to the object which has iteration logic The advantage of external iterator is that many iterators can be made active simultaneously on the existing or same object a href wiki D0 A8 D0 B0 D0 B1 D0 BB D0 BE D0 BD Cite web title Shablon Cite web cite web a Nedijsnij url status unknown dovidka Watt Stephen M The University of Western Ontario Department of Computer Science Arhiv originalu PDF za 6 serpnya 2012 Procitovano 8 serpnya 2012 Some authors use the term iterator and others the term generator Some make subtle distinctions between the two a href wiki D0 A8 D0 B0 D0 B1 D0 BB D0 BE D0 BD Cite web title Shablon Cite web cite web a Nedijsnij url status unknown dovidka Freeman Eric Freeman Elisabeth Kathy Sierra Bert Bates 2004 Hendrickson Mike Loukides Mike red Head First Design Patterns paperback T 1 O REILLY s 338 ISBN 978 0 596 00712 6 Procitovano 9 serpnya 2012 Glossary Python 3 8 4 documentation Procitovano 15 lipnya 2020 Vecerina Ivan 1 lyutogo 2006 BYTES Arhiv originalu za 9 serpnya 2012 Procitovano 8 serpnya 2012 An index only can be used for containers that efficiently support random access i e direct access to an element at a given position An iterator is a more general concept Iterators offer efficient traversal of linked lists files and a number of other data structures It often leads to the generation of more efficient code a href wiki D0 A8 D0 B0 D0 B1 D0 BB D0 BE D0 BD Cite web title Shablon Cite web cite web a Nedijsnij url status unknown dovidka Kevin Waterson C Iteratoren Iterator Kategorien nim cppreference com Procitovano 9 serpnya 2012 Kevin Waterson Iterators Concepts sgi Procitovano 9 serpnya 2012 larsmans 6 bereznya 2011 stackoverflow Arhiv originalu za 8 serpnya 2012 Procitovano 9 serpnya 2012 a href wiki D0 A8 D0 B0 D0 B1 D0 BB D0 BE D0 BD Cite web title Shablon Cite web cite web a Nedijsnij url status unknown dovidka Kevin Waterson Introduction to SPL Introduction to Standard PHP Library SPL PHPRO ORG Procitovano 9 serpnya 2012 Collier Andrew Arhiv originalu za 18 zhovtnya 2018 Procitovano 16 listopada 2013 Intel Threading Building Blocks for Open Source Arhiv originalu za 1 travnya 2015 Procitovano 9 serpnya 2012 The iterator types iterator and const iterator are of the forward iterator categoryPosilannyaJava s Iterator Iterable and ListIterator Explained angl NET interface angl Stattya Understanding and Using Iterators Dzhoshua Gatkomba angl Stattya A Technique for Generic Iteration and Its Optimization en angl Iterators angl Boost C Iterator Library angl Java interface angl PHP Object Iteration angl STL Iterators angl What are iterators Reference description angl