2014-02-17 65 views
0

例如,我在C++中有一個動態數組,它類似於std::vector。在實施erase功能時,這是最好的方法嗎,還是有更快捷/更高效的更好方法?有沒有更好的方法來擦除動態數組元素?

void erase(iterator it) 
{ 
    my_array<template_argument> x; 
    for(iterator i = begin(); i != end(); ++i) 
    { 
     if(i == it) 
     { 
      continue; 
     } 
     x.push(*i); 
    } 
    *this = x; 
} 
+0

「與std :: vector類似」,表示內存必須是連續的,對嗎?此外,「my_array」是否適用於任何數據類型,還是僅用於某個子集(例如,內置值類型,如int或double)? –

回答

4

您可以執行就地刪​​除,而不是製作幾乎整個陣列的新副本。

for(iterator i = it; i+1 != end(); ++i) 
{ 
    *i = *(i+1); // or std::iter_swap(i, i+1); if swapping is more efficient 
} 
pop(); 
+0

而對於C++ 11,'std :: move'可能會更快/需要,具體取決於'T'。 – Jarod42

+2

注意:雖然在異常安全方面存在很大差異。 OP的代碼實現** Strong Exception Guarantee **(又名事務模式):如果拋出任何異常,原始對象將保持不變;你的代碼只實現了**基本的例外保證**:如果任何異常由複製構造函數拋出,那麼你留下一堆移位元素,一個半複製的元素等等......基本上你的整個數組都被丟棄。當然,強烈的例外保證通常會有很大的成本... –

0

這真的取決於您的要求。如前所述,一般來說,您將使用std::iter_swap來移動要移除的元素之前(或之後)的所有元素。

例如,如果你看std::deque,它保證至多N/2通過選擇是否移動那些之前或之後取決於要刪除的元素是更接近頭部還是尾部來移動元素。

相關問題