2015-09-16 137 views
0

我有插座的阵列(PFD [NFD] .FD)。我也有一个指针数组(event_tracking * track [10])。如果在我的代码中出现了一点,我尝试从一个关闭的套接字接收数据,我想要移除两个数组中的数组元素,然后移动数组以填充空白点。删除元素,C++

for(j=1; j<nfd; j++) { 
     if(pfd[j].revents&POLLIN) { 

      char* p = track.receive_datagram(); 

      if (p == 0) { 
      delete track[j-1]; 
      //Delete element in pfd[nfd].fd 
      //Reorder elements of track array 
      //Reorder elements of pfd array 
      } 

     } 
    } 

我知道你可以调用delete运算符要求跟踪析构函数,但我不知道如何重新排序阵列现在,一个是缺少的元素?或者如何删除并重新排列pfd数组?

任何帮助,将不胜感激!我找不到在我的文本中删除和重新排序数组的任何示例。

+3

你可以使用[矢量](http://www.cplusplus.com/reference/vector/vector/)? – MeetTitan

+4

如果元素的顺序不重要,可以用最后一个覆盖已删除的项目并减小长度。 – rodrigo

回答

1

一个C++解决方案应该使用一个std::vectorstd::array并忘记一切(可能存储智能指针,例如std::unique_ptr<T>)。

如果你真的想要去的硬盘的方式,你可以设置这样的事情:

  • 寻找元素删除(指数i
  • 如果i == LENGTH_OF_ARRAY - 1什么都不做,在iLENGTH_OF_ARRAY - 1否则换元以便要移除的元素位于最后位置
  • 调用delete array[LENGTH_OF_ARRAY - 1]销毁最后一个元素
  • 调用array = realloc(array, (LENGTH_OF_ARRAY - 1) * sizeof(array[0]))释放数组中的内存对于被删除的元素,并更新LENGTH_OF_ARRAY
+0

请注意,您不应该将'realloc'与'new/new []'或'delete/delete []'混合。你应该改用'malloc'或'calloc'和'free'。你可以安全地使用'new'和'delete'来指向在'malloc'创建的数组中的对象 - 也就是说,你可以在给定的代码库中混合使用分配器 - 但是你不能将它们混合到任何特定的分配中。 – CBHacking

+0

事实上,由于在数组的元素上调用了delete,所以OP没有任何分配,但OP应该用'calloc' /'malloc'来分配'array'。 – Jack

+0

对,只是想确保他们知道不要使用'new'和'delete []'来调用'realloc'的数组。呵呵..现在我想知道是否有'realloc'作为'new' /'delete' ... – CBHacking

0

不改变你的数据结构,解决方法是复制每个元素后面的数组,你删除数组的前一个元素。这对链表更有效。使用由new[]分配的数组,您不会重新分配任何内容,但可以调整vector的大小。