调整c ++向量的大小而不调用它们的构造函数

时间:2011-04-30 10:17:07

标签: c++ vector

所以我有这种情况:

std::vector<Coord3D> thevector;

其中Coord3D只是一个带有3个浮点数的简单结构:x,y和z。构造函数也只是简单地有x = 0; y = 0; z = 0;等

现在,假设我想将另一个向量的内容附加到向量中。

是否可以将向量的大小调整为thevector.size()+ theothervector.size(),而无需调用Coord3D()的构造函数?

原因是我想记忆其他人的内容。在一些基准测试之后,用构造函数初始化内容结果需要一些时间。 std :: loop fill也需要相当多的时间。

所以是的,有没有办法在绕过元素的构造函数时调整向量的大小?这会涉及狡猾的黑客吗?

4 个答案:

答案 0 :(得分:8)

thevector.insert(thevector.end(), theothervector.begin(), theothervector.end());

如果Coord3D是可按位复制的,编译器应该能够将其优化为与memcpy相同的代码。

答案 1 :(得分:2)

std :: vectors都有一个分配器,通常是默认的分配器。 allocator的construct()成员函数代表您调用每个元素的构造函数。

为了避免调用per元素构造函数,创建自己的allocator并确保construct()成员函数有一个空函数体(或者在运行时决定是否调用元素构造函数的其他逻辑)。 p>

使用自定义分配器创建向量后,只需调整向量的大小()。将不会有每个元素的构造函数调用。

我已成功使用此技术将std :: vector指向数据库的持久存储。它避免了每个元素的构造函数(否则会覆盖数据库的存储),也避免了数据副本(因为自定义分配器的设计是为了知道要引用的数据库存储的哪个部分)。

答案 2 :(得分:0)

您应该放大capacity而不是size。对于此用途reserve()。并且要获得当前容量,请使用capcity()

此代码将解释如何:

std::vector<Coord3D> thevector;
thevector.reserve(n); //where n is size you want
Coord3D * vector_start = &(thevector[0]);
//do memcpy to vector_start

但是这段代码不安全,与std::vector的实现有关。

答案 3 :(得分:0)

  

是否可以将向量的大小调整为thevector.size()+ theothervector.size(),而无需调用Coord3D()的构造函数?

不,当您尝试调整向量的大小时。当您调整向量的大小时,向量的元素需要复制到新位置,在这种情况下,如果我没有错,则需要调用类的复制构造函数

正如其他人所说,你可以任何电话预备。但是矢量是空的,没有元素。