如何将std::views::filter结果用于std::ranges::random_access_range?
关于std::views::filter与随机访问范围的问题
std::views::filter生成的范围无法满足std::ranges::random_access_range概念(原因应该是它无法将过滤后临时范围的随机访问映射回原范围,若我的推理或表述有误请指正)。
我可以使用std::ranges::to<std::vector>()将临时范围转换为vector,但存在以下疑问:
- 它会复制原vector
v中的值,导致无法修改原数据,有解决办法吗? - 这是性能和内存分配层面最高效的方案吗?
- 该方案对性能和内存分配的实际影响是什么?是否会在内存中动态创建真实的std::vector?
(注:此处的“最高效”指无业务场景限制的情况;实际场景中可修改rar函数内部处理过滤,避免额外分配。问题是,若rar函数不可修改,是否有更优方案?)
#include <algorithm> #include <ranges> #include <vector> #include <iostream> constexpr auto rar = []<std::ranges::random_access_range Rng>(Rng & range) { std::ranges::for_each(range, [](auto& v) { v = 0.0f; }); }; int main() { std::vector<float> v = { 0.0f, 1.0f, 0.0f, 2.0f }; // rar(v); auto no_zeros = v | std::views::filter([](const auto& lhs) { return lhs != 0.0f; }); // 无法编译,因为std::views::filter生成的范围不满足std::ranges::random_access_range // rar(no_zeros); // 这是唯一可行方案吗?其性能与内存分配影响如何? auto no_zeros_as_vector = v | std::views::filter([](const auto& lhs) { return lhs != 0.0f; }) | std::ranges::to<std::vector>(); rar(no_zeros_as_vector); std::ranges::copy ( v, std::ostream_iterator<float>{std::cout, ", "} ); std::cout << std::endl; }
内容的提问来源于stack exchange,提问作者Damir Tenishev
相关产品推荐
相关产品推荐

