c++ - 使用折叠表达式合并多个 vector

标签 c++ c++17

尝试学习 c++17 的一些新特性时遇到了折叠表达式。 http://en.cppreference.com/w/cpp/language/fold

使用折叠表达式,我可以对元素进行多次 push_back。我只是想使用 折叠表达式 将多个 vector 合并为一个 vector 。我知道还有其他方法可以做合并 vector ,但想使用折叠表达式来完成

#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 vector 添加到 v

 push_back_vec(v,m,x,y);

当前收到错误 下一行“No matching argument”//这是预期的

push_back_vec(v,m,x,y);

这里需要改什么

void push_back_vec(std::vector<T>& v, Args&&... args)

最佳答案

要连接 2 个 vector ,您可以这样做

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

所以要连接 N 个 vector ,您可以这样做

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

如果您希望同一个函数附加值或 vector ,您可以添加多个重载:

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

关于c++ - 使用折叠表达式合并多个 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45519117/

相关文章:

c++ - 是否有有关在 Visual Studio 2008 中进行 C++ 编程的教程?

c++ - 在 C++ 中比较 bool 和 1

c++ - C++ 14和c++ 17中相同代码的不同输出

具有宽松类型要求的 C++17 lambda 捕获

c++ - 用 'grouped'元素迭代 vector ?

c++ - Clang 和 C++ 模块 TS

c++ - cpp 中的引用如何具有相同的内存地址?

c++ - 一台 Linux 机器上的段错误,但另一台使用 C++ 代码的机器上没有

C++ 推断指向成员模板参数的指针

c++ - 转发成员函数的 cv-ref-qualifier