如何在已声明的向量中插入传递给函数的一组值

时间:2019-07-01 13:09:33

标签: c++

让我们考虑以下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;
}

5 个答案:

答案 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));

例如,vr可以是:

std::vector<int> v;
const int r[] = {3, 4, 5};

通过ADL使用std::beginstd::end的优点是,它将与实现适当操作的任何容器一起使用,并与数组一起使用。

答案 3 :(得分:1)

您可以使用带有可变参数包的函数模板将所有参数(无论多少)自动添加到向量中:

template<class... N>
void setTipp(N&... n)
{
    (v.push_back(n), ...);
}

也就是说,考虑到您在注释中对该案例的进一步描述,将参数作为单独的变量传递几乎没有任何意义。而是一个数组。

答案 4 :(得分:0)

您可以将std::applystd::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轻巧一些,可能不是大量参数的最佳选择。