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

Patricia Arquette
リリース: 2024-11-01 06:28:30
オリジナル
820 人が閲覧しました

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!