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

