我有以下结构
struct a {
int array[20]
int array2[45]
}
我创建了这个结构的载体
vector<a> vec;
我用过这个vec。现在我想初始化(将向量元素中对象内的所有数组值设置为零)。我怎么能这样做??
答案 0 :(得分:1)
阅读评论后,您还没有显示填充您的矢量的代码。现在,您希望重新使用存储而不是创建新存储,并且您希望重新初始化它。
任何C ++容器的任何算法的规范答案都可能在标准算法中找到。在这种情况下,this。按照自己喜欢的方式初始化结构,并将其复制到向量中。沿着这些方向:
a A = {0};
std::fill(vec.begin(), vec.end(), A);
如果您想要说速度不够快,请检查。我认为你会发现它非常有效率。上面的代码绝对安全,适用于fill
的任何正确初始化的参数。我怀疑如果不对a
的实现做出一些假设,就可以加快速度。
答案 1 :(得分:0)
事实证明,这是一个比它最初出现的问题更有趣的问题。
tl; dr:如果您使用的是C ++ 03或更高版本的编译器,则无需费心。
您需要了解value initialization和default initialization之间的区别。基本上,值初始化会将所有元素设置为零,默认初始化将使它们全部保持不变。如果结构的任何默认元素(递归地)具有用户定义的默认构造函数,那么值和默认初始化都将调用它。
请注意,值初始化很多比memset
更好,因为
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}})。如果你这样做,你几乎肯定知道你在做什么。
<强>结论强>