Range-V3 を使用した一時コンテナーによる Range パイプライン処理
問題:
要素の範囲 (src) と、範囲の要素を入力として受け取り、ベクトルを返すサードパーティ関数 (f)。 f を使用して範囲内の各要素を変換し、結果のベクトルを単一の範囲に平坦化したいとします。ただし、一時コンテナに対してビューを作成できないため、view::transform と view::join を直接使用しても機能しません。
解決策:
このようなパイプラインをサポートするには、 range-v3 では、views::cache1 演算子が導入されています。この演算子を使用すると、ビューの結果を一時コンテナに保存し、そのコンテナのビューを作成できます。パイプラインに views::cache1 を含めることで、平坦化されたベクトルのビューを作成できます。
auto rng = src | views::transform(f) | views::cache1 | views::join;
コード サンプル:
次のコード サンプルは、その方法を示しています。 views::cache1 を使用して、範囲からの要素を変換して平坦化する範囲パイプラインを作成します:
<code class="cpp">#include <range/v3/view.hpp> #include <range/v3/algorithm.hpp> #include <vector> std::vector<std::string> f(int i) { return std::vector<std::string>(i, char('a' + i)); } int main() { auto rng = views::iota(0, 4) | views::transform([](int i) { return f(i); }) | views::cache1 | views::join('-'); check_equal(rng, {'-', 'b', '-', 'c', 'c', '-', 'd', 'd', 'd'}); CPP_assert(input_range<decltype(rng)>); CPP_assert(!range<const decltype(rng)>); CPP_assert(!forward_range<decltype(rng)>); CPP_assert(!common_range<decltype(rng)>); return 0; }</code>
以上がRange-V3 パイプラインを使用して関数から返されたベクトルを平坦化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。