使用memset初始化包含数组的结构的向量

时间:2016-05-08 13:45:55

标签: c++ arrays struct memset

我有以下结构

struct a {
     int array[20]
     int array2[45]
}

我创建了这个结构的载体

vector<a> vec;

我用过这个vec。现在我想初始化(将向量元素中对象内的所有数组值设置为零)。我怎么能这样做??

2 个答案:

答案 0 :(得分:1)

阅读评论后,您还没有显示填充您的矢量的代码。现在,您希望重新使用存储而不是创建新存储,并且您希望重新初始化它。

任何C ++容器的任何算法的规范答案都可能在标准算法中找到。在这种情况下,this。按照自己喜欢的方式初始化结构,并将其复制到向量中。沿着这些方向:

a A = {0};
std::fill(vec.begin(), vec.end(), A);

如果您想要说速度不够快,请检查。我认为你会发现它非常有效率。上面的代码绝对安全,适用于fill的任何正确初始化的参数。我怀疑如果不对a的实现做出一些假设,就可以加快速度。

答案 1 :(得分:0)

事实证明,这是一个比它最初出现的问题更有趣的问题。

tl; dr:如果您使用的是C ++ 03或更高版本的编译器,则无需费心。

您需要了解value initializationdefault initialization之间的区别。基本上,值初始化会将所有元素设置为零,默认初始化将使它们全部保持不变。如果结构的任何默认元素(递归地)具有用户定义的默认构造函数,那么值和默认初始化都将调用它。

请注意,值初始化很多memset更好,因为

  • 它将调用默认构造函数
  • 它将正确初始化浮点(到0.0)和指针(到NULL)。虽然memset 可能会在您的实施中执行此操作,但无法保证。

使用 n 元素创建矢量的常规方法就是调用:

std::vector<a> vec(n);

<强> C ++ 98

这将调用

std::vector<a>::vector(size_type count, 
                       const T& value = T(),
                       const Allocator& alloc = Allocator());

value对象将是默认构造的,您需要以某种方式初始化元素。执行此操作的最佳方法是提供要复制的正确值初始化值。所以:

const static a azeroed;  // Because this is static, it will be value initialized
std::vector<a> vec(20,azeroed);

技术说明:C ++ 98标准不包含术语“值初始化”,但azeroed的初始化是相同的。

<强> C ++ 03

调用相同的向量构造函数,但是从C ++ 03开始,value参数值初始化(因此花园中的所有内容都是红润的)。

<强> C ++ 11

致电

std::vector<a>::vector(size_type count);

哪个值直接初始化元素。

<强> C ++ 14

致电

std::vector<a>::vector(size_type count, const Allocator& alloc = Allocator());

(基本上,他们意识到他们忘记了分配器参数)。这里有一个非常微妙的区别,因为元素是通过调用Allocator::construct构造的,虽然默认的分配器将值初始化元素,但是可以提供一个不支持的自定义版本(参见{{ 3}})。如果你这样做,你几乎肯定知道你在做什么。

<强>结论

  • 除非您使用的是真正的C ++ 98编译器,否则无需调用memset
  • 向向量构造函数提供显式值初始化值比调用memset更安全。
  • memset可能无法正确初始化非整数内置值(尽管可能会这样)。
  • memset 肯定 clobber什么都是正确的构造函数。这是一个巨大的维护危险。如果维护程序员改变了结构,使其不再是POD,代码仍将编译 - 它只会做错误的事情。
  • 要为结构提供正确的默认构造函数,还有很多要说的,然后你就不必担心是否有任何元素被初始化,即使你有本地副本。