如何用std::vector bar的对应值替换foo中的所有奇数?
解决std::replace_if替换时关联另一个容器对应元素的问题
你碰到的问题其实是std::replace_if本身的设计局限——它只能用固定值替换符合条件的元素,没办法直接关联另一个容器的对应位置元素。不过我们有几种简单可靠的方式来实现你的需求:
方法一:手动遍历迭代器(最直观)
这种方式直接同时遍历两个容器的迭代器,判断当前foo元素是否为奇数,是的话就用bar的对应元素替换它。代码逻辑清晰,容易理解:
#include <iostream> #include <vector> bool IsOdd(int i) { return ((i % 2) == 1); } int main() { std::vector<int> foo{1,2,3,4,5,6,7}; std::vector<int> bar{10,20,30,40,50,60,70}; auto foo_it = foo.begin(); auto bar_it = bar.begin(); // 确保两个容器长度一致的情况下遍历 for (; foo_it != foo.end() && bar_it != bar.end(); ++foo_it, ++bar_it) { if (IsOdd(*foo_it)) { *foo_it = *bar_it; } } std::cout << "foo contains:"; for (auto i : foo) { std::cout << ' ' << i; } std::cout << '\n'; return 0; }
方法二:使用std::transform(更符合STL风格)
std::transform支持同时处理两个输入范围的元素,我们可以用它把判断和替换逻辑整合到一个lambda表达式里:
#include <iostream> #include <algorithm> #include <vector> bool IsOdd(int i) { return ((i % 2) == 1); } int main() { std::vector<int> foo{1,2,3,4,5,6,7}; std::vector<int> bar{10,20,30,40,50,60,70}; // 依次取foo和bar的对应元素,判断后替换,结果存回foo std::transform(foo.begin(), foo.end(), bar.begin(), foo.begin(), [](int foo_val, int bar_val) { return IsOdd(foo_val) ? bar_val : foo_val; }); std::cout << "foo contains:"; for (auto i : foo) { std::cout << ' ' << i; } std::cout << '\n'; return 0; }
方法三:强行用std::replace_if(不推荐)
如果一定要用std::replace_if,可以通过捕获bar的迭代器来实现,但这种方式依赖std::replace_if的内部调用顺序,代码可读性差且有风险,不建议在生产代码中使用:
#include <iostream> #include <algorithm> #include <vector> bool IsOdd(int i) { return ((i % 2) == 1); } int main() { std::vector<int> foo{1,2,3,4,5,6,7}; std::vector<int> bar{10,20,30,40,50,60,70}; auto bar_it = bar.begin(); std::replace_if(foo.begin(), foo.end(), // 谓词:判断是否为奇数,非奇数时移动bar迭代器 [&](int val) { if (IsOdd(val)) { return true; } ++bar_it; return false; }, // 替换值:取当前bar元素并移动迭代器 [&]() mutable { return *bar_it++; }); std::cout << "foo contains:"; for (auto i : foo) { std::cout << ' ' << i; } std::cout << '\n'; return 0; }
总的来说,前两种方法都是更稳妥的选择,推荐优先使用手动遍历或者std::transform,代码清晰且符合STL的使用规范。
内容的提问来源于stack exchange,提问作者Martiinz
相关产品推荐
相关产品推荐

