【问题标题】:Range-v3: Why is ranges::to_vector needed here?Range-v3:为什么这里需要ranges::to_vector?
【发布时间】:2021-12-09 11:02:13
【问题描述】:

我正在尝试计算一个反向的views::partial_sum。下面的代码给出了非反转 partial_'min' 的预期结果,但我需要使用ranges::to_vector 来取消views::reverse 最终结果(因为你不能views::reverseviews::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_vectors 也是如此,所以根据 Barry 的回答,reverse 一定有问题。

【问题讨论】:

    标签: c++ c++20 range-v3 std-ranges


    【解决方案1】:

    这是一个 range-v3 错误,它是 views::reverse 未正确传播 value_type 的结果,因此您最终会得到一个 vector&lt;common_pair&lt;unsigned int, float&amp;&gt;&gt;(请注意参考),您应该最终得到一个vector&lt;pair&lt;unsigned int, float&gt;&gt;。这将由this PR 修复。

    与此同时,您可以通过 ranges::to&lt;std::vector&lt;std::pair&lt;unsigned int, float&gt;&gt;&gt;() 为要转换为的 vector 提供显式类型来自行解决此问题。

    【讨论】:

      猜你喜欢
      • 2012-06-03
      • 1970-01-01
      • 2021-08-27
      • 2010-12-15
      • 2019-01-16
      • 2021-10-22
      • 2012-09-08
      • 1970-01-01
      相关资源
      最近更新 更多