Генератор (програмування)
Генератор — в інформатиці, це підпрограма, що контролює ітерації в циклі.
Генератор є підвидом ітератора.
Різниця між ітератором і генератором:
- Ітератор проходить по колекції по одному елементу за раз.
- Генератор генерує елементи послідовності по одному елементу за раз.
Генератор може бути реалізований у вигляді наступних конструкцій потоку керування як:
- співпрограма;
- продовження першого порядку.
Генератор є частковим випадком співпрограми, оскільки завжди повертає керування до того коду, який його викликав.
Приклади в різних мовах програмування
C#
public static IEnumerable<int> GetEven(IEnumerable<int> numbers)
{
foreach (int i in numbers)
if ((i % 2) == 0)
yield return i;
}
F#
seq
{
for b in 0 .. 25 do
if b < 15 then
yield b * b
}
C++
C++11 дозволяє застосовувати 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; }
};
В Microsoft Visual C++ 2015 реалізовані деякі пропозиції для C++17
#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)
- Some Details on F# Computation Expressions
- Resumable Functions (revision 4)
- Resumable functions in C++
- More about resumable functions in C++