让我们考虑以下c ++代码:
std::vector<int> v;
void setTipp(int& n1, int& n2, int& n3, int& n4, int& n5, int& n6) {
//insert all 6 elements inside vector
//but not like v.pushback(n1); etc
//also not like v.resize(6); v[0]=n1; etc
}
有一种方法可以将向量6中的所有6个元素自动插入,即使向量v已被除垢。
我想在v内插入值,例如v {n1,n2 .... n6};或喜欢
for (int i=0; i<=6;i++){
//v.pusback(n1);pushback(n2) etc.
//or v[i]=n1....n6;
}
有没有一种方法可以在函数“ setTipp”内不创建新的向量或数组
无需执行以下操作:
void setTipp(int& n1, int& n2, int& n3, int& n4, int& n5, int& n6) {
std::vector<int> tmp{n1,n2,n3,n4,n5,n6};
v=tmp;
}
答案 0 :(得分:6)
您可以使用initializer_list:
std::vector<int> v;
void setTipp(int n1, int n2, int n3, int n4, int n5, int n6) {
for (int i : {n1, n2, n3, n4, n5, n6}) {
v.push_back(i);
}
}
但是我可能会将签名更改为:
void setTipp(const std::array<int, 6>& a) {
v.insert(v.end(), a.begin(), a.end());
}
因此更改了以下呼叫:
setTipp(4, 8, 15, 16, 23, 42);
到
setTipp({{4, 8, 15, 16, 23, 42}});
答案 1 :(得分:3)
我想在v内插入值,例如v {n1,n2 .... n6};
您可以尝试:
int arr[] = {n1, n2, n3, n4, n5, n6};
v.insert(std::end(v), std::begin(arr), std::end(arr));
答案 2 :(得分:1)
使用std::vector::insert
一次插入整个范围r
,例如:
using std::begin;
using std::end;
v.insert(v.end(), begin(r), end(r));
例如,v
和r
可以是:
std::vector<int> v;
const int r[] = {3, 4, 5};
通过ADL使用std::begin
和std::end
的优点是,它将与实现适当操作的任何容器一起使用,并与数组一起使用。
答案 3 :(得分:1)
您可以使用带有可变参数包的函数模板将所有参数(无论多少)自动添加到向量中:
template<class... N>
void setTipp(N&... n)
{
(v.push_back(n), ...);
}
也就是说,考虑到您在注释中对该案例的进一步描述,将参数作为单独的变量传递几乎没有任何意义。而是一个数组。
答案 4 :(得分:0)
您可以将std::apply与std::make_tuple一起使用,并以此方式对每个元组值应用 push_back
。不幸的是,您还需要使用std::bind,使整个练习对我的口味来说有点沉重。
// Given:
vec_type my_vec;
// Do:
std::apply(
std::bind(my_vec, &vec_type::push_back, _1),
std::make_tuple(n1, n2, n3, n4, n5, n6)
);
[可能不编译,只是演示一下想法。]
push_back
,但这并不是一种优化。std::tuple
仅比std::vector
轻巧一些,可能不是大量参数的最佳选择。