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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 17:32:36