Skip to content

Commit 505a007

Browse files
committed
fold_left(_first)_with_iter : 得られるイテレータを利用する例追加 #1088
1 parent 743eef7 commit 505a007

File tree

2 files changed

+89
-0
lines changed

2 files changed

+89
-0
lines changed

reference/algorithm/ranges_fold_left_first_with_iter.md

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,51 @@ int main() {
191191
-1
192192
```
193193
194+
### 戻り値のイテレータを活用する例
195+
196+
```cpp example
197+
#include <ranges>
198+
#include <algorithm>
199+
#include <functional>
200+
#include <print>
201+
#include <forward_list>
202+
203+
using namespace std::ranges;
204+
205+
int main() {
206+
// forward_rangeな入力
207+
std::forward_list flist = {2, 4, 6, 7, 9, 3, 1, 4, 10, 3, 2, 6};
208+
209+
// take_whileを使用して、先頭から10未満の要素だけを取り出す
210+
forward_range auto rng = flist | views::take_while([](int n) { return n < 10; });
211+
212+
auto [last, sum] = fold_left_first_with_iter(rng, std::plus<>{});
213+
214+
std::println("sum = {:d}", sum.value_or(0));
215+
216+
// 同じ範囲に対して別の処理をしたい
217+
// rng(take_while)をそのまま使うとイテレーション時に終端判定をもう一度行うことになり非効率
218+
auto [unuse1, mul1] = fold_left_first_with_iter(rng, std::multiplies<>{});
219+
220+
// 先ほど求めた終端を使用して元の範囲の上で部分範囲を構築
221+
auto [unuse2, mul2] = fold_left_first_with_iter(subrange{flist.begin(), last}, std::multiplies<>{});
222+
223+
std::println("mul = {:d}, {:d}", mul1.value_or(0), mul2.value_or(0));
224+
}
225+
```
226+
* fold_left_first_with_iter[color ff0000]
227+
* take_while[link /reference/ranges/take_while_view.md]
228+
* subrange[link /reference/ranges/subrange.md]
229+
* println[link /reference/print/println.md]
230+
* value_or[link /reference/optional/optional/value_or.md]
231+
232+
### 出力
233+
234+
```
235+
sum = 36
236+
mul = 36288, 36288
237+
```
238+
194239
## 実装例
195240

196241
```cpp

reference/algorithm/ranges_fold_left_with_iter.md

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,50 @@ int main() {
185185
-1
186186
```
187187
188+
### 戻り値のイテレータを活用する例
189+
190+
```cpp example
191+
#include <ranges>
192+
#include <algorithm>
193+
#include <functional>
194+
#include <print>
195+
#include <forward_list>
196+
197+
using namespace std::ranges;
198+
199+
int main() {
200+
// forward_rangeな入力
201+
std::forward_list flist = {2, 4, 6, 7, 9, 3, 1, 4, 10, 3, 2, 6};
202+
203+
// take_whileを使用して、先頭から10未満の要素だけを取り出す
204+
forward_range auto rng = flist | views::take_while([](int n) { return n < 10; });
205+
206+
auto [last, sum] = fold_left_with_iter(rng, 0, std::plus<>{});
207+
208+
std::println("sum = {:d}", sum);
209+
210+
// 同じ範囲に対して別の処理をしたい
211+
// rng(take_while)をそのまま使うとイテレーション時に終端判定をもう一度行うことになり非効率
212+
auto [unuse1, mul1] = fold_left_with_iter(rng, 1, std::multiplies<>{});
213+
214+
// 先ほど求めた終端を使用して元の範囲の上で部分範囲を構築
215+
auto [unuse2, mul2] = fold_left_with_iter(subrange{flist.begin(), last}, 1, std::multiplies<>{});
216+
217+
std::println("mul = {:d}, {:d}", mul1, mul2);
218+
}
219+
```
220+
* fold_left_with_iter[color ff0000]
221+
* take_while[link /reference/ranges/take_while_view.md]
222+
* subrange[link /reference/ranges/subrange.md]
223+
* println[link /reference/print/println.md]
224+
225+
### 出力
226+
227+
```
228+
sum = 36
229+
mul = 36288, 36288
230+
```
231+
188232
## 実装例
189233

190234
```cpp

0 commit comments

Comments
 (0)