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
未注释时,intermediate2
的 views::values
全部为零(尽管密钥计算正确)。取消注释第一个 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;
编辑
我忽略了取消注释最后的 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
提供显式类型来自行解决此问题
我正在尝试计算反向 views::partial_sum
。下面的代码给出了非反向 partial_'min' 的预期结果,但我需要使用 ranges::to_vector
来取消 views::reverse
最终结果(因为你不能 views::reverse
一个views::partial_sum
)。但是,当第二个 to_vector
未注释时,intermediate2
的 views::values
全部为零(尽管密钥计算正确)。取消注释第一个 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;
编辑
我忽略了取消注释最后的 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
提供显式类型来自行解决此问题