Range-v3:为什么这里需要 range::to_vector ?

Tom*_*ton 5 c++ range-v3 c++20 std-ranges

我正在尝试计算一个反转的views::partial_sum. 下面的代码给出了非反转的partial_'min'的预期结果,但我需要使用它ranges::to_vector来取消views::reverse最终结果(因为你不能views::reversea views::partial_sum)。但是,当第二个to_vector未注释时,views::valuesofintermediate2全部为零(尽管键计算正确)。取消注释第一个to_vector可以解决此问题,但我想知道为什么?我是否有可能避免第一个to_vector?或者我是否应该不理会理解而只是插入to_vectors 直到代码起作用。

    auto input = std::vector<float>{} | actions::push_back(views::iota(0u, COUNT)) | actions::shuffle(std::default_random_engine{});;

    auto intermediate1 = views::zip(views::iota(0u, COUNT), input)
        //| to_vector
        ;
    auto intermediate2 = intermediate1
        | views::reverse
        | views::partial_sum(
            [](std::pair<unsigned, float> a, std::pair<unsigned, float> b)
            {
                if (a.second > b.second)
                    return b;
                else
                    return a;
            })
        //| to_vector
        ;
    auto ans = intermediate2
        //| views::reverse
        ;

    std::cout << "values  = " << (ans | ranges::views::values | views::take(23)) << std::endl;
    std::cout << "indices = " << (ans | ranges::views::keys | views::take(23)) << std::endl;
Run Code Online (Sandbox Code Playgroud)

编辑 我忽略了取消注释最后reverse再次破坏了代码,即使是两个s,所以根据巴里的回答,to_vector它一定是一个问题。reverse

Bar*_*rry 6

这是一个 range-v3 错误,是由于未正确views::reverse传播. 此 PR将修复此问题。value_typevector<common_pair<unsigned int, float&>>vector<pair<unsigned int, float>>

同时,您可以vector通过为要转换的类型提供显式类型来自行修复此问题ranges::to<std::vector<std::pair<unsigned int, float>>>()