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

如何用std::transform替换筛选偶数的C++ for循环?

用标准库算法替代条件遍历循环的解决方案

原代码需求是遍历vec2,将其中的偶数追加到vec中:

std::vector<int> vec{ 1,2,3 };
std::vector<int> vec2{ 4, 5, 6, 7, 8, 9 };

for (int i = 0; i < vec2.size(); i++) {
    if (vec2[i] % 2 == 0)
        vec.push_back(vec2[i]);
}

你尝试用std::transform实现,但需要明确:std::transform的设计目标是对每个输入元素执行转换后输出,不支持过滤逻辑——它会处理所有输入元素,无法跳过不符合条件的元素,所以单纯用std::transform无法直接替代原循环的过滤行为。

正确的替代方案:使用std::copy_if

标准库中专门用于"复制符合条件元素"的算法是std::copy_if,完全匹配你的需求,代码如下:

#include <algorithm>
#include <vector>

int main() {
    std::vector<int> vec{1,2,3};
    std::vector<int> vec2{4,5,6,7,8,9};

    std::copy_if(vec2.begin(), vec2.end(), std::back_inserter(vec),
        [](int num) { return num % 2 == 0; });
}
  • 第四个参数是一个谓词lambda,判断元素是否为偶数
  • 只有满足条件的元素会被通过std::back_inserter追加到vec中,和原循环逻辑完全一致,且更符合标准库的设计规范。

不推荐的std::transform hack写法

如果硬要使用std::transform,只能通过冗余操作实现过滤,比如插入不符合条件的元素后再删除,这种写法效率低且违背算法设计意图,示例如下(仅作演示,不建议使用):

std::transform(vec2.begin(), vec2.end(), std::back_inserter(vec),
    [&vec](int num) {
        if (num % 2 == 0) {
            return num;
        } else {
            vec.pop_back(); // 回退back_inserter的插入操作
            return 0; // 返回无意义值
        }
    });

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 23:42:37