Генератор — в інформатиці, це підпрограма, що контролює ітерації в циклі.
Генератор є підвидом ітератора.
Різниця між ітератором і генератором:
- Ітератор проходить по колекції по одному елементу за раз.
- Генератор генерує елементи послідовності по одному елементу за раз.
Генератор може бути реалізований у вигляді наступних конструкцій потоку керування як:
- співпрограма;
- продовження першого порядку.
Генератор є частковим випадком співпрограми, оскільки завжди повертає керування до того коду, який його викликав.
Приклади в різних мовах програмування
public static IEnumerable<int> GetEven(IEnumerable<int> numbers) { foreach (int i in numbers) if ((i % 2) == 0) yield return i; }
seq { for b in 0 .. 25 do if b < 15 then yield b * b }
дозволяє застосовувати foreach цикли до будь-якого класу, що надає функції begin
та end
. Отже, можливо написати подібний до генератора клас визначивши обидва ці методи і методи ітератора (operator!=
, operator++
і operator*
) в одному класі. Наприклад, можливо написати таку програму:
#include <iostream> int main() { for (int i: range(10)) { std::cout << i << std::endl; } return 0; }
Просте втілення класа range виглядало б так:
class range { private: int last; int iter; public: range(int end): last(end), iter(0) {} // Повертають ітератор const range& begin() const { return *this; } const range& end() const { return *this; } // Функції ітератора bool operator!=(const range&) const { return iter < last; } void operator++() { ++iter; } int operator*() const { return iter; } };
В реалізовані деякі пропозиції для
#include <experimental/generator> using namespace std::experimental; inline generator<int> values() { for (int i = 0; i < 100; ++i) { __yield_value i*i; } }
Можливо писати в стилі, який через вкладеність викликів, читатиметься знизу вверх:
auto seq = take(5 ,transform([](int x) {return x*x;} ,where([](int x) {return x % 2 == 0;} ,fibonacci() ))); for (auto i : seq) printf("%d ", i);
Посилання
- yield (C# Reference) [ 16 листопада 2016 у Wayback Machine.]
- Some Details on F# Computation Expressions [ 6 лютого 2010 у Wayback Machine.]
- Resumable Functions (revision 4) [ 9 березня 2016 у Wayback Machine.]
- Resumable functions in C++ [ 28 листопада 2015 у Wayback Machine.]
- More about resumable functions in C++ [ 28 листопада 2015 у Wayback Machine.]
Це незавершена стаття про програмування. Ви можете проєкту, виправивши або дописавши її. |
Ця стаття потребує додаткових для поліпшення її . (жовтень 2016) |
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Generator v informatici ce pidprograma sho kontrolyuye iteraciyi v cikli Generator ye pidvidom iteratora Riznicya mizh iteratorom i generatorom Iterator prohodit po kolekciyi po odnomu elementu za raz Generator generuye elementi poslidovnosti po odnomu elementu za raz Generator mozhe buti realizovanij u viglyadi nastupnih konstrukcij potoku keruvannya yak spivprograma prodovzhennya pershogo poryadku Generator ye chastkovim vipadkom spivprogrami oskilki zavzhdi povertaye keruvannya do togo kodu yakij jogo viklikav Prikladi v riznih movah programuvannyaC public static IEnumerable lt int gt GetEven IEnumerable lt int gt numbers foreach int i in numbers if i 2 0 yield return i F seq for b in 0 25 do if b lt 15 then yield b b C C 11 dozvolyaye zastosovuvati foreach cikli do bud yakogo klasu sho nadaye funkciyi begin ta end Otzhe mozhlivo napisati podibnij do generatora klas viznachivshi obidva ci metodi i metodi iteratora operator operator i operator v odnomu klasi Napriklad mozhlivo napisati taku programu include lt iostream gt int main for int i range 10 std cout lt lt i lt lt std endl return 0 Proste vtilennya klasa range viglyadalo b tak class range private int last int iter public range int end last end iter 0 Povertayut iterator const range amp begin const return this const range amp end const return this Funkciyi iteratora bool operator const range amp const return iter lt last void operator iter int operator const return iter V Microsoft Visual C 2015 realizovani deyaki propoziciyi dlya C 17 include lt experimental generator gt using namespace std experimental inline generator lt int gt values for int i 0 i lt 100 i yield value i i Mozhlivo pisati v stili yakij cherez vkladenist viklikiv chitatimetsya znizu vverh auto seq take 5 transform int x return x x where int x return x 2 0 fibonacci for auto i seq printf d i Posilannyayield C Reference 16 listopada 2016 u Wayback Machine Some Details on F Computation Expressions 6 lyutogo 2010 u Wayback Machine Resumable Functions revision 4 9 bereznya 2016 u Wayback Machine Resumable functions in C 28 listopada 2015 u Wayback Machine More about resumable functions in C 28 listopada 2015 u Wayback Machine Ce nezavershena stattya pro programuvannya Vi mozhete dopomogti proyektu vipravivshi abo dopisavshi yiyi Cya stattya potrebuye dodatkovih posilan na dzherela dlya polipshennya yiyi perevirnosti Bud laska dopomozhit udoskonaliti cyu stattyu dodavshi posilannya na nadijni avtoritetni dzherela Zvernitsya na storinku obgovorennya za poyasnennyami ta dopomozhit vipraviti nedoliki Material bez dzherel mozhe buti piddano sumnivu ta vilucheno zhovten 2016