[英]Range-v3: Why is ranges::to_vector needed here?
我正在尝试计算一个反向的views::partial_sum
。 下面的代码给出了非反转partial_'min'的预期结果,但我需要使用ranges::to_vector
来ranges::to_vector
views::reverse
最终结果(因为你不能views::reverse
a views::partial_sum
)。 然而,当第二个to_vector
被取消注释时, intermediate2
的views::values
全为零(尽管键被正确计算)。 取消注释第一个to_vector
将解决此问题,但我想知道为什么? 我是否有可能避免第一个to_vector
? 或者我是否应该to_vector
理解而只是在代码工作之前加入to_vector
s。
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;
这特别是views::parital_sum
一个问题,因为修改注释如下
//| 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
会给我预期的结果。
这是一个 range-v3 错误,是由于views::reverse
没有正确传播value_type
,所以你最终得到了一个vector<common_pair<unsigned int, float&>>
(注意参考),你应该真正结束加上vector<pair<unsigned int, float>>
。 这将由这个 PR修复。
同时,您可以通过为要转换成的vector
提供显式类型来解决这个问题,方法是通过ranges::to<std::vector<std::pair<unsigned int, float>>>()
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.