C++ 调整c+的大小+;不调用其构造函数的向量

C++ 调整c+的大小+;不调用其构造函数的向量,c++,vector,C++,Vector,所以我有这样的情况,我有: std::vector<Coord3D> thevector; std::vector thevector; 其中Coord3D只是一个简单的结构,有3个浮动:x、y和z。构造函数也只有x=0;y=0;z=0;等等 现在,假设我想将另一个向量的内容附加到向量中 是否可以将向量的大小调整成向量?siz()+ thvector(siz)(),而不做C++调用CONDRO3D-()的构造函数? 原因是我想记住其他向量的内容。在一些基准测试之后,与构造器初始化

所以我有这样的情况,我有:

std::vector<Coord3D> thevector;
std::vector thevector;
其中Coord3D只是一个简单的结构,有3个浮动:x、y和z。构造函数也只有x=0;y=0;z=0;等等

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

是否可以将向量的大小调整成向量?siz()+ thvector(siz)(),而不做C++调用CONDRO3D-()的构造函数? 原因是我想记住其他向量的内容。在一些基准测试之后,与构造器初始化内容需要一些时间。loopfill也需要相当多的时间


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

你应该扩大他们的
容量
,而不是
大小
。为此,请使用
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 thevector;
保留向量(n)//其中n是您想要的尺寸
Coord3D*vector_start=&(向量[0]);
//执行memcpy以启动向量

但该代码是不安全的,并且与
std::vector
的实现有关

你应该扩大他们的
容量
,而不是
大小
。为此,请使用
reserve()
。要获取当前容量,请使用
capcity()

thevector.insert(thevector.end(), theothervector.begin(), theothervector.end());
此代码将解释如何:

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 thevector;
保留向量(n)//其中n是您想要的尺寸
Coord3D*vector_start=&(向量[0]);
//执行memcpy以启动向量
但该代码是不安全的,并且与
std::vector
的实现有关

thevector.insert(thevector.end(), theothervector.begin(), theothervector.end());
如果
Coord3D
可按位复制,则编译器应能够将其优化为与
memcpy
相同的代码

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

是否可以将向量的大小调整成向量?siz()+ thvector(siz)(),而不做C++调用CONDRO3D-()的构造函数? 不,当您尝试调整向量大小时。调整向量大小时,需要将向量的元素复制到新位置,在这种情况下,如果我没有错,则需要调用类的复制构造函数

正如其他人所说,你可以任意调用reserve。但是向量是空的,没有元素

是否可以将向量的大小调整成向量?siz()+ thvector(siz)(),而不做C++调用CONDRO3D-()的构造函数? 不,当您尝试调整向量大小时。调整向量大小时,需要将向量的元素复制到新位置,在这种情况下,如果我没有错,则需要调用类的复制构造函数


正如其他人所说,你可以任意调用reserve。但是向量是空的,没有元素。

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

要避免调用每个元素的构造函数,请创建自己的分配器,并确保construct()成员函数的函数体为空(或在运行时决定是否调用元素的构造函数的其他逻辑)

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


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

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

要避免调用每个元素的构造函数,请创建自己的分配器,并确保construct()成员函数的函数体为空(或在运行时决定是否调用元素的构造函数的其他逻辑)

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


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

真的,有什么叫做std::loop?!等等,错了,我是说填充。我的错!真的,有什么叫做std::loop的吗?!等等,错了,我是说填充。我的错!是否有任何方法来欺骗开始()和()以使它可以使用实际保留的大小?这是错误的,向量不会考虑内存初始化,每当你尝试<代码> PuthObjor()/代码>或<代码> Resiz()/Cuth>时,它将调用已经构建的内存中的构造函数,这是一个未定义的行为。因为向量仍然认为它在概念上是在调用保留之前的大小,它实际上是不可用的。是否有任何方法来欺骗开始()和结束(),以便它可以使用实际保留的大小?这是错误的,向量不会考虑内存初始化,无论何时尝试
push_back()
resize()
它都会在已经构建的内存上调用构造函数,这是未定义的行为。因为向量仍然认为它在概念上是调用reserve之前的大小,所以它实际上是不可用的。