range-v3 で一時コンテナを返す関数を使用して無限の範囲を変換するにはどうすればよいですか?

Barbara Streisand
リリース: 2024-10-30 04:42:03
オリジナル
408 人が閲覧しました

How can I transform an infinite range with a function returning temporary containers in range-v3?

一時コンテナを使用した Range-v3 変換のパイプライン

range-v3 では、以下を返すサードパーティ関数を使用して、潜在的に無限の範囲の要素を変換するパイプラインを作成します。一時コンテナのビューを作成できないため、ベクトルは困難になる可能性があります。

問題: 一時ベクトルを返す関数による範囲の変換

次のコードを考えてみましょう:

auto rng = src | view::transform(f) | view::join;
ログイン後にコピー

ここで、src は型 T の無限の範囲であり、f は std::vector を返すサードパーティ関数です。 view::transform は f によって返される一時コンテナのビューを作成するため、このコードを実行するとコンパイル エラーが発生します。

解決策: Cache1 Operator の導入

range-v3 の最近の更新では、この問題の解決策は、views::cache1 演算子です。この演算子は、変換の出力を保存する一時コンテナを作成し、パイプライン内の他のビューがその要素にアクセスできるようにします。

目的のパイプラインを正しく実装するには、views::join:

auto rng = src | view::transform(f) | views::cache1 | views::join;
ログイン後にコピー
コード例

次のコードサンプルは、views::cache1 の実際の使用法を示しています。

<code class="cpp">auto rng = views::iota(0, 4)
        | views::transform([](int i) { return std::string(i, char('a' + i)); })
        | views::cache1
        | views::join('-');

check_equal(rng, {'-', 'b', '-', 'c', 'c', '-', 'd', 'd', 'd'});</code>
ログイン後にコピー
範囲プロパティ

重要です変換された範囲 rng は、ソース範囲のすべての範囲プロパティを保持するわけではないことに注意してください。上の例では、一時コンテナの作成により、前方範囲の概念が失われます。

以上がrange-v3 で一時コンテナを返す関数を使用して無限の範囲を変換するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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