web-dev-qa-db-ja.com

動的な数の範囲アダプタを使用することは可能ですか?

私は範囲がかなり新しいことで、動的な数の範囲アダプタを適用する方法があるかどうかを知りたかったです。私はしばらくのコードを使って埋め込まれました、そして私はいくつかの検索をしました、しかし役に立ちません。

#include <iostream>
#include <ranges>

int main() {
    auto output = std::ranges::views::iota(2, 100);

    for (int i = 2; i < 100; i++) {
        output = output | std::ranges::views::filter([i](int num){ return num % i != 0 || num == i; });
    }

    std::cout << "The 10th prime is: " << output[9] << "\n";
}
 _

基本的に、私はこのようなものが欲しいですが、これはコンパイルエラーを与えます(no match for 'operator=')。範囲アダプタの各アプリケーションは新しいタイプを必要とするようですので、この範囲を動的に作成することはできません。これを回避する方法はありますか?

4
Jack Casey

この特定のケースでは、代わりにフィルタ述語を構築できます。


int main() {
    auto output = std::views::iota(2, 100);

    std::function<bool(int)> filter_fn = [] (int) { return true; };

    for (int i = 2; i < 100; i++)
    {
        filter_fn = [=] (int num) {
            return filter_fn(num) && (num % i != 0 || num == i);
        };
    }

    auto primes = output | std::views::filter(filter_fn);

    std::cout << "The 10th prime is: " <<
        (primes | std::views::drop(9)).front() << "\n";
}
 _

ただし、わかりません。これは述語の間接呼び出しの連鎖を作成するため、かなり効率的です。

1
bolov