如何给C++向量分配值

3

我知道可以像这样初始化一个向量:

vector<int> v{1,3,4,6};

然而,当我定义一个包含向量的类时,我无法在声明它的位置初始化它,就像这样:
class C {
  public: 
    vector<int> v; 
    C();
};

因此我需要在构造函数中初始化它。以下代码可以实现,但不够规范:
C::C() {
    v.resize(4); 
    v[0]=1; 
    v[1]=3; 
    v[2]=4; 
    v[3]=6;
}

我该如何像vector<int> v{1,3,4,6};这样整洁而直接地初始化它,而不是一个一个地赋值?
编辑: 也许我没有表达清楚我的情况。{1,3,4,6}的值可能不是预定义的值,它们会依赖于一些逻辑和条件:if(condition_a) {v[0] = 0; v[1]=3; ...} else {v[0]=4;v[0]=8;...}。因此,我必须处理一些其他事情来知道如何初始化这个向量,所以我不能像一些答案中建议的那样使用初始化列表。请问有什么建议吗?

如果condition_a由调用者确定(即创建C实例的函数),那么你的构造函数应该接受一个初始化列表,并且调用者应该传递它。如果condition_a是在类内部根据未提供给构造函数的信息确定的(例如通过静态变量),那么你的设计是有缺陷的。能够使用相同的构造函数参数构造两次并产生两个在逻辑上不同的对象(具有不同内容)的类是一个潜在的软件错误,可能会由最终用户发现,而对于开发人员来说可能非常难以发现。 - Peter
4个回答

7
以下方法有效:
C::C()
    : v{ 1, 3, 4, 6 }
{}

请注意,上面的代码中您将std::initializer_list传递给std::vector的构造函数。

5

您可以在成员初始化列表中进行初始化,例如:

class C{
public: 
    vector<int> v; 
    C() : v {1,3,4,6} {}
};

或者使用默认成员初始化(自C++11起), 例如:

class C{
public: 
    vector<int> v {1,3,4,6};
    C() {}
};

3
这应该可以工作:
#include <vector>
class C {
   std::vector<int> v;
public :
   C() {
      if(...)
         v = { 0, 1, 2, 3, 4 };
      else
         v = { 5, 6, 7, 8, 9, 10, 11, 12};
      //and other statement
   }
};

谢谢,这正是我想要找到的。 - coin cheung
我本来有这个想法,但是你没有定义它们基于什么条件。只要你的条件与向量无关,这个方法就可以使用。(否则你需要先给它初始化一些值!) - user11422223

1
你可以使用初始化列表来构造对象。
关于条件初始化,根据你编辑后的问题,只需将向量内容初始化为0,然后应用所需的任何条件并相应地初始化特定值。
class C 
{
  public:
    vector<int> v;
    C() : v{0,0,0,0}
    {   if(v.size()==4) // your condition
          v[0]=1;
    }
};

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接