You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 08:03:15