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

