【一人 C++20 Advent Calendar 2019】範囲ライブラリとして <ranges> が追加される【21日目】
一人 C++20 Advent Calendar 2019 21日目の記事になります。
今回もまだ実装しているコンパイラがないので軽めの内容です。
[範囲ライブラリとして が追加される]
今まではイテレータの組を利用してイテレーションを行っていたのですが、C++20 では新しく <ranges>
ライブラリが追加されます。
<ranges>
ではこれまでのイテレータ(std::begin
や std::end
)を関数に渡して使用するのではなくて配列に対して直接操作するような形でイテレーションする事が出来るようになります。
例えば filter
や transform
は以下のように書くことが出来るようになります。
#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.Oven
や Boost.Range
みたいなやつですね。
同じく C++20 で追加される Concept をバリバリ使っているようなのでどうやって実装しているのかを調べてみると楽しそう
今まで C++ でイテレーション処理を行なうのがとてもめんどくさかったのでこれでかなり改善されるといいですねー。