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

std::replace_if有无支持lambda生成依赖旧值的新值的等价实现?

解决方案

标准库原生的std::replace_if设计上仅支持固定新值替换,不支持传入新值生成器,以下是STL和Boost库的现成解决方案:

方案1:全版本STL通用方案:std::for_each

所有C++标准版本均支持,无需额外依赖,逻辑和自定义replace_if完全等价,无额外性能开销:

std::for_each(aa.begin(), aa.end(), [](AA& item) {
    if (item.a_ == 1) {
        item = AA(item.a_ + 1);
    }
});

方案2:C++20及以上范围语法方案

如果使用C++20及以上标准,可以结合范围过滤器实现更简洁的写法:

for (auto& item : aa | std::views::filter([](const AA& x) { return x.a_ == 1; })) {
    item = AA(item.a_ + 1);
}

方案3:Boost库现成方案

Boost.Algorithm库提供了现成的transform_if接口,直接支持按条件转换替换元素:

#include <boost/algorithm/transform_if.hpp>

boost::algorithm::transform_if(
    aa.begin(), aa.end(), 
    aa.begin(), // 输出迭代器和输入迭代器一致,实现原地修改
    [](const AA& old_val) { return AA(old_val.a_ + 1); }, // 新值生成器
    [](const AA& x) { return x.a_ == 1; } // 匹配条件谓词
);

内容的提问来源于stack exchange,提问作者X.J.L

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 18:36:04