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

如何结合std::ranges::transform与std::ranges::copy_if实现按需投影复制?

标准库Ranges中实现"筛选+投影+复制"的简洁方案

你要的需求可以通过标准库视图的组合来实现,完全符合你不想用中间容器、自定义函数或for_each的要求:用std::ranges::views::filter先筛选满足谓词的元素,再用std::ranges::views::transform做投影,最后用std::ranges::copy把结果写入目标范围。

核心逻辑

这两个视图都是惰性求值的,不会生成中间容器存储临时结果,所有操作都是在遍历源范围时实时完成的,没有额外复制开销。

代码示例

假设我们要从整数源范围中筛选偶数,将它们的平方值复制到目标容器:

#include <ranges>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> src = {1, 2, 3, 4, 5, 6};
    std::vector<int> dst;
    dst.reserve(src.size()); // 提前预留空间优化性能

    std::ranges::copy(
        // 先筛选偶数,再投影为平方值
        src | std::ranges::views::filter([](int val) { return val % 2 == 0; })
            | std::ranges::views::transform([](int val) { return val * val; }),
        std::back_inserter(dst)
    );
    // 最终dst内容:{4, 16, 36}
}

为什么这比其他方法合适

  • std::ranges::copy_if只能复制原元素,无法对筛选后的元素做投影;
  • std::ranges::transform会处理所有元素,无法提前筛选;
  • 视图组合的方式完全复用标准库组件,不需要自定义transform_if,也没有中间容器的额外内存消耗。

内容的提问来源于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.30 07:57:40