Push_back 可变函数参数转换为向量?
Push_back variadic function parameters into a vector?
我正在尝试 push_back 可变参数函数的参数,如下所示,但编译器说存在类型不匹配(由于参数是通用类型而向量是 int)。我应该怎么做才能使参数兼容?
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>&) {}
继续 'gradual unpacking'
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), ...);
}
我正在尝试 push_back 可变参数函数的参数,如下所示,但编译器说存在类型不匹配(由于参数是通用类型而向量是 int)。我应该怎么做才能使参数兼容?
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>&) {}
继续 'gradual unpacking'
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), ...);
}