代码之家  ›  专栏  ›  技术社区  ›  RocketSearcher

C++矢量:用于循环到std::变换

  •  0
  • RocketSearcher  · 技术社区  · 1 年前

    我得到了以下表格中的代码

    vector<int> vec{ 1,2,3 };
    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 摆脱for循环?感谢您的帮助:)

    我试过这样的方法:

    std::transform(vec2.begin(), vec2.end(), std::back_inserter(vec), ...);
    

    但我不确定最后一个地方要添加什么( ...

    3 回复  |  直到 1 年前
        1
  •  7
  •   Raildex    1 年前

    你想要的是 std::copy_if :

        std::vector<int> vec{ 1,2,3 };
        std::vector<int> vec2{ 4, 5, 6, 7, 8, 9 };
    
        std::copy_if(vec2.cbegin(),vec2.cend(),std::back_inserter(vec),[](const int num){
            return num % 2 == 0;
        });
        for(auto&& i : vec) {
            std::cout << i;
        }
    

    std::copy_if 使用谓词作为选择标准,将元素从一个范围复制到另一个范围。

    std::transform 映射 从一个范围到另一个范围:T->转换->U

        2
  •  7
  •   Yksisarvinen    1 年前

    std::transform 是不适合这份工作的工具。它不能根据条件过滤元素,输入范围中的所有元素都必须放在输出范围中(转换后)。

    使用 std::copy_if 相反

    std::copy_if(vec2.begin(), vec2.end(), std::back_inserter(vec), [](int i){return i % 2 == 0;});
    
        3
  •  0
  •   Konstantin Makarov    1 年前

    已经决定:(
    我认为任务是把所有的代码放在一个 transform .

    std::transform(vec2.begin(),
        std::stable_partition(vec2.begin(), vec2.end(),
            [](const int& v) { return v % 2 == 0; }),
        std::back_inserter(vec),
        [](const int& v) { return v; });
    

    请注意的元素 vec2 将重新排序。