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

如何用C++标准库算法将std::vector<Edge>复制到std::vector<Edge*>

解决方案

如果你使用的是C++20或更高版本,可以利用标准库的范围(Ranges)特性,结合std::views::filter和std::views::transform简洁实现需求:

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

// 示例:假设筛选条件为判断Edge的某个属性
std::vector<Edge> edges = ...;
std::vector<Edge*> outputs;

std::ranges::copy(
    edges | std::views::filter([](const Edge& e) { return /* 你的筛选条件,比如e.isValid() */; })
          | std::views::transform([](Edge& e) { return &e; }),
    std::back_inserter(outputs)
);

std::views::filter负责筛选符合条件的Edge元素,std::views::transform将筛选后的元素转换为指向它的指针,最后通过std::ranges::copy把结果插入outputs。这种方式无需复制元素,效率很高。

如果是C++17及更早版本,没有范围库支持,可以用std::for_each配合lambda表达式直接实现,逻辑清晰且完全基于标准库:

#include <vector>
#include <algorithm>

std::vector<Edge> edges = ...;
std::vector<Edge*> outputs;

std::for_each(edges.begin(), edges.end(), [&outputs](Edge& e) {
    if (/* 你的筛选条件 */) {
        outputs.push_back(&e);
    }
});

这种方式遍历每个元素,判断条件后将符合要求的元素指针加入结果容器,实现简单直接。

你提到的std::copy_if仅负责筛选元素,不处理类型转换(从Edge到Edge*),因此无法直接完成需求。如果一定要结合std::copy_if,需要自定义输出迭代器来做转换,但这会增加代码复杂度,反而不如上述方案实用。

内容的提问来源于stack exchange,提问作者Shout

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 03:55:27