使用指向矢量的指针,其中涉及使用' new'

时间:2016-01-06 17:00:13

标签: c++ pointers vector

我想创建一个指向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来释放记忆,速度问题是否仍会困扰我?

4 个答案:

答案 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]没问题,应该做得更好。

OLD ANSWER:

你可以做到

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分配的内存的向量。我相信,顺序分配器会这样做。