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

Range-v3: Why is ranges::to_vector needed here?

我正在尝试计算反向 views::partial_sum。下面的代码给出了非反向 partial_'min' 的预期结果,但我需要使用 ranges::to_vector 来取消 views::reverse 最终结果(因为你不能 views::reverse一个views::partial_sum)。但是,当第二个 to_vector 未注释时,intermediate2views::values 全部为零(尽管密钥计算正确)。取消注释第一个 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;

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

这是一个 range-v3 错误,是 views::reverse 未正确传播 value_type 的结果,因此您最终得到一个 vector<common_pair<unsigned int, float&>>(注意参考),其中你真的应该以 vector<pair<unsigned int, float>> 结尾。这将由 this PR.

修复

与此同时,您可以通过 ranges::to<std::vector<std::pair<unsigned int, float>>>().

为要转换成的 vector 提供显式类型来自行解决此问题