我想创建一个指向struct
的指针向量vector<myStruct*> vec
对于向量中的元素,并非所有元素都包含数据。其中一些可能指向 NULL 。 那么,我应该先在每个元素
中按new
创建空间
for(int i = 0; vec.size() ;i++){
if (thisSpaceIsValid(i))
vec.at(i) = new myStruct;
else
vect.at(i) = NULL;
}
问题来了:
- 如果我对每个元素使用new
,那将非常慢。我怎样才能加快速度?有没有办法创建我需要的所有空间,自动访问这个空间的指针到向量(vec
这里)?
- 如果以后我使用delete
来释放记忆,速度问题是否仍会困扰我?
答案 0 :(得分:3)
如果我使用&#34; new&#34;对于每个元素,它会非常慢。我怎样才能加快速度?有没有办法创建我需要的所有空间,自动访问这个空间的指针到向量(&#34; vec&#34;在这里)?
你可以做到。
让我们说vector
的大小为M
,你只需要N
个元素来指向对象,其他元素都是空指针。您可以使用:
myStruct* objects = new myStruct[N];
然后,使用:
for(int i = 0, j = 0; vec.size(); i++)
{
if (thisSpaceIsValid(i))
{
if ( j == N )
{
// Error. Do something.
}
else
{
vec[i] = objects+j;
++j;
}
}
else
{
vect[i] = NULL;
}
}
您现在必须确保能够跟踪objeccts
的值,以便您可以使用
delete [] objects;
<强> PS 强>
您的问题可能会有更好,更优雅的解决方案。花一点时间思考这个问题是值得的。
答案 1 :(得分:1)
再次阅读这个问题后,我似乎误解了这个问题。所以这是一个经过编辑的答案。
如果您只需要在某种初始化阶段执行代码,则可以在数组中创建myStruct的所有实例,然后只需指向R Sahu已经提出的向量中的实例。请注意,该解决方案要求您同时创建和删除所有实例。
但是,如果多次执行此代码和/或不确切知道需要多少个myStruct实例,则可以覆盖结构的new和delete并自行处理内存分配。
有关此示例,请参阅Callling object constructor/destructor with a custom allocator。请参阅Jerry Coffin的答案。
顺便说一句 - 当你从0迭代到大小时,你不需要vec.at(i)
。 vec[i]
没问题,应该做得更好。
你可以做到
vector<myStruct*> vec(10000, nullptr);
生成一个带有例如10000个元素的向量,所有元素都初始化为nullptr
之后,您可以使用指向结构的指针填充相关元素。
仅适用于delete
for (auto e : vec) delete e;
因为在nullptr上执行delete
是安全的
答案 2 :(得分:0)
如果你需要一个指针向量,并且想避免调用new,那么首先自己创建一个结构容器,然后将指向元素的指针分配到你的vec中。选择结构容器时要小心。如果使用结构的向量,请确保提前保留所有元素,否则当向量增长时,其元素可能会移动到不同的内存位置。另一方面,Deque保证其元素不会移动。
如果可能的话,在性能很重要的情况下,应该避免多个小的new和delete调用。
答案 3 :(得分:0)
我想的越多,我就越不喜欢@ RSahu的解决方案。特别是,我认为在这种情况下的内存管理将是一场噩梦。相反,我建议使用unique_ptr拥有通过custom alloctor分配的内存的向量。我相信,顺序分配器会这样做。