ホームページ  >  記事  >  バックエンド開発  >  Range-V3 パイプラインを使用して関数から返されたベクトルを平坦化するにはどうすればよいですか?

Range-V3 パイプラインを使用して関数から返されたベクトルを平坦化するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-01 06:28:30821ブラウズ

How Can I Flatten Vectors Returned from a Function Using Range-V3 Pipelines?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。