Push_back可变参数函数参数到向量中

Push_back variadic function parameters into a vector?

本文关键字:参数 函数 向量 变参 back Push      更新时间:2023-10-16

我正在尝试push_back可变参数函数的参数,如下所示,但编译器说存在类型不匹配(由于参数是通用类型,而向量是整数(。我应该怎么做才能使参数兼容?

vector<int> x;
template<typename... Rest>
void foo(Rest... rest) {
    x.push_back(rest...);
}

在 C++14 及之前版本中:

void foo(Rest... rest) {
    int a[] = {0, (x.push_back(rest), 0)...};
    static_cast<void>(a);  // unused
}

在C++17:

void foo(Rest... rest) {
    (x.push_back(rest), ...);
}

从基本情况开始:

void push_all(vector<int>&) {}

继续"逐步开箱">

template<typename... Rest>
void push_all(vector<int>& vec, int val, Rest... rest)
{
    vec.push_back(val);
    push_all(vec, rest...);
}

没有那么紧凑,但更容易摸索。

您应该更喜欢此版本,因为它更快并且也适用于C++11。

template<typename... Rest>
void foo(Rest... rest) {
    x.insert(x.end(), { static_cast<decltype(x)::value_type>(rest)...});
}

但是,如果您出于某种原因需要使用push_back()那么至少调用reserve()以使其更快。

template<typename... Rest>
void foo(Rest... rest) {
    x.reserve(sizeof...(Rest));
    (x.push_back(rest), ...);
}