2015-09-16 198 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的大小。