【一人 C++20 Advent Calendar 2019】範囲ライブラリとして <ranges> が追加される【21日目】

一人 C++20 Advent Calendar 2019 21日目の記事になります。
今回もまだ実装しているコンパイラがないので軽めの内容です。

[範囲ライブラリとして が追加される]

今まではイテレータの組を利用してイテレーションを行っていたのですが、C++20 では新しく <ranges> ライブラリが追加されます。
<ranges> ではこれまでのイテレータstd::beginstd::end)を関数に渡して使用するのではなくて配列に対して直接操作するような形でイテレーションする事が出来るようになります。
例えば filtertransform は以下のように書くことが出来るようになります。

#include <ranges>
#include <iostream>
#include <vector>

int
main(){
    auto even = [](int n) { return n % 2 == 0; };
    auto twice = [](int n) { return n + n; };
    auto xs = std::vector{ 1, 2, 3, 4, 5, 6 };

    for(int n
        // | でイテレーション処理を結合していく
        : xs
        | std::views:filter(even)       // 引数の関数を元に絞り込み
        | std::views::transform(twice)  // 引数の関数に要素を置き換える
    ) {
        std::cout << n << std::endl;
    }

    return 0;
}
/*
output:
4
8
12
*/

いわゆる PStade.OvenBoost.Range みたいなやつですね。
同じく C++20 で追加される Concept をバリバリ使っているようなのでどうやって実装しているのかを調べてみると楽しそう 今まで C++イテレーション処理を行なうのがとてもめんどくさかったのでこれでかなり改善されるといいですねー。

参照