使用赋值()是初始化C++结构向量的好方法吗?

使用赋值()是初始化C++结构向量的好方法吗?,c++,stdvector,C++,Stdvector,结构 struct Vanish { int iCount; int iRow; }; 我将Vanish的std::vector定义为类的一个成员,并希望在构造函数中初始化它,如下所示: class BigClass { public: BigClass(); private: std::vector<Vanish> tovanish; }; void BigClass::BigClass() { Vanish empty = {0,0};

结构

struct Vanish
{
  int iCount;
  int iRow;
};
我将Vanish的std::vector定义为类的一个成员,并希望在构造函数中初始化它,如下所示:

class BigClass
{
  public:
    BigClass();
  private:
    std::vector<Vanish> tovanish;
};

void BigClass::BigClass()
{
  Vanish empty = {0,0};
  tovanish.assign(MAX_VANISH, empty);
}
有没有更好的方法,或者这被认为是可以的

有更好的办法吗

是的,当然

BigClass::BigClass() : tovanish(MAX_VANISH) {}
这将为您提供一个具有MAX_invision value初始化的invision元素的向量

有更好的办法吗

是的,当然

BigClass::BigClass() : tovanish(MAX_VANISH) {}

这将为您提供一个具有MAX_invision value初始化的invision元素的向量。

最好在构造函数的初始值设定项列表中执行此操作:

BigClass::BigClass()
: tovanish(MAX_VANISH)
{

}
这样,您将避免可能的向量重新分配。请注意,向量的构造函数将初始化其元素的值。Vanish中int成员的值初始化只会将它们归零

请注意,在C++11中,使用统一初始化可以轻松指定其他值:

BigClass::BigClass()
: tovanish(MAX_VANISH, {42, 24})
{

}

最好在构造函数的初始值设定项列表中执行此操作:

BigClass::BigClass()
: tovanish(MAX_VANISH)
{

}
这样,您将避免可能的向量重新分配。请注意,向量的构造函数将初始化其元素的值。Vanish中int成员的值初始化只会将它们归零

请注意,在C++11中,使用统一初始化可以轻松指定其他值:

BigClass::BigClass()
: tovanish(MAX_VANISH, {42, 24})
{

}

这是否意味着如果我只是将tovanish的初始化放在默认构造函数之外,编译器就会这样做?但它会用初始化的Vanish对象初始化向量,这些对象有两个未初始化的int成员。所以我们还需要一个合适的消失默认值c'tor。@juanchopanza向量将默认构造其元素。Vanish的默认构造函数是noop,因为它只包含int…@leemes:Vector使用值初始化,这将初始化像Vanish这样的POD结构。在这种情况下不需要任何显式构造函数。@leemes:Nah,如果省略,POD类型将得到默认初始化,否则它们将得到值初始化。这对C++03也是有效的。这是否意味着如果我只是在默认构造函数中保留tovanish的初始化,编译器就会这样做?但是它使用初始化的Vanish对象初始化向量,这些对象有两个未初始化的int成员。所以我们还需要一个合适的消失默认值c'tor。@juanchopanza向量将默认构造其元素。Vanish的默认构造函数是noop,因为它只包含int…@leemes:Vector使用值初始化,这将初始化像Vanish这样的POD结构。在这种情况下不需要任何显式构造函数。@leemes:Nah,如果省略,POD类型将得到默认初始化,否则它们将得到值初始化。这对C++03也是有效的。构造函数0,0是由编译器定义的,还是我必须自己定义我得到一个错误,说没有重载函数需要2个参数。构造函数0,0是由编译器定义的,还是我必须自己定义我得到一个错误,说没有重载函数接受2个参数。