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

