From 09c61f94ef2e5795801b131449073c34e47f4995 Mon Sep 17 00:00:00 2001 From: yoh Date: Sat, 7 Jan 2023 19:25:27 +0900 Subject: [PATCH] =?UTF-8?q?generator:=20=E4=BE=8B=E7=A4=BA=E3=82=B3?= =?UTF-8?q?=E3=83=BC=E3=83=89=E6=8B=A1=E5=85=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- reference/generator/generator.md | 103 ++++++++++++++++++++++++++++++- 1 file changed, 101 insertions(+), 2 deletions(-) diff --git a/reference/generator/generator.md b/reference/generator/generator.md index db468a516f..c7e1c9d10a 100644 --- a/reference/generator/generator.md +++ b/reference/generator/generator.md @@ -82,12 +82,13 @@ using yielded = ## 例 +### 例1: 単一値の生成 ```cpp example #include #include #include -// 偶数値列を(無限に)生成するコルーチン +// 偶数値列を無限生成するコルーチン std::generator evens() { int n = 0; @@ -110,7 +111,7 @@ int main() * co_yield[link /lang/cpp20/coroutines.md] * std::views::take[link /reference/ranges/take_view.md] -### 出力 +#### 出力 ``` 0 2 @@ -119,6 +120,104 @@ int main() 8 ``` +### 例2: レンジ要素値の逐次生成 +```cpp example +#include +#include +#include +#include +#include + +// レンジの要素値を逐次生成するコルーチン +std::generator ints() +{ + int arr[] = {1, 2, 3}; + co_yield std::ranges::elements_of(arr); + std::vector vec = {4, 5, 6}; + co_yield std::ranges::elements_of(vec); + std::list lst = {7, 8, 9}; + co_yield std::ranges::elements_of(lst); +} + +int main() +{ + for (int n : ints())) { + std::cout << n << ' '; + } +} +``` +* std::generator[color ff0000] +* co_yield[link /lang/cpp20/coroutines.md] +* std::ranges::elements_of[link /reference/ranges/elements_of.md] + +#### 出力 +``` +1 2 3 4 5 6 7 8 9 +``` + +### 例3: ジェネレータのネスト +```cpp example +#include +#include +#include +#include + +// 二分木ノード +struct node { + int value; + std::unique_ptr left = nullptr; + std::unique_ptr right = nullptr; +}; + +// 二分木を幅優先走査: 左(left)→自ノード→右(right) +std::generator traverse(const node& e) +{ + if (e.left) { + co_yield std::ranges::elements_of(traverse(*e.left)); + } + co_yield e.value; + if (e.right) { + co_yield std::ranges::elements_of(traverse(*e.right)); + } +} + +int main() +{ + // tree: + // 2 + // / ¥ + // 1 4 + // / ¥ + // 3 5 + node tree = { + 2, + std::make_unique(1), + std::make_unique( + 4, + std::make_unique(3), + std::make_unique(5) + ), + }; + + for (int n: traverse(tree)) { + std::cout << n << std::endl; + } +} +``` +* std::generator[color ff0000] +* co_yield[link /lang/cpp20/coroutines.md] +* std::ranges::elements_of[link /reference/ranges/elements_of.md] +* std::make_unique[link /reference/memory/make_unique.md] + +#### 出力 +``` +1 +2 +3 +4 +5 +``` + ## バージョン ### 言語