代码之家  ›  专栏  ›  技术社区  ›  Hariom Singh

使用折叠表达式合并多个向量

  •  0
  • Hariom Singh  · 技术社区  · 8 年前

    http://en.cppreference.com/w/cpp/language/fold

    使用折叠表达式,我可以对元素进行多次推回 将多个向量合并为单个向量。我知道还有其他方法可以合并向量,但我想使用折叠表达式

    #include <iostream>
    #include <vector>
    
    template<typename T, typename... Args>
    void push_back_vec(std::vector<T>& v, Args&&... args)
    {
        (v.push_back(args), ...);
    }
    int main()
    {
    
        std::vector<int> v;
        std::vector<int> m ={1,2,3};
        std::vector<int> x ={4,5,6};
        std::vector<int> y ={7,8,9};
    
        //push_back_vec(v,m,x,y);
    
        push_back_vec(v, 66, 67, 68);
        for (int i : v) std::cout << i << ' ';
    
    }
    

    输出

    66 67 68 Program ended with exit code: 0
    

    尝试使下面的语句生效,将m,x,y向量添加到v

     push_back_vec(v,m,x,y);
    

    目前正在获取 错误

    push_back_vec(v,m,x,y);
    

    这里需要改变什么

    void push_back_vec(std::vector<T>& v, Args&&... args)
    
    1 回复  |  直到 8 年前
        1
  •  9
  •   Jarod42    4 年前

    要连接2个向量,可以执行以下操作:

    template <typename T>
    void concatenate(std::vector<T>& v, const std::vector<T>& v2)
    {
        v.insert(v.end(), v2.begin(), v2.end());
    }
    

    为了连接N个向量,你可以

    template <typename T, typename ... Ts>
    void concatenate(std::vector<T>& v, const Ts&... ts)
    {
        (v.insert(v.end(), ts.begin(), ts.end()), ...);
    }
    

    template <typename T>
    void append(std::vector<T>& v, const std::vector<T>& v2)
    {
        v.insert(v.end(), v2.begin(), v2.end());
    }
    
    template <typename T>
    void append(std::vector<T>& v, const T& value)
    {
        v.push_back(value);
    }
    

    然后

    template<typename T, typename... Args>
    void push_back_vec(std::vector<T>& v, Args&&... args)
    {
        (append(v, args), ...);
    }
    

    Demo