如何用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
相关产品推荐
相关产品推荐

