2014-03-27 63 views
0

在大學的CS類中,我們已經分配了幾個功能模板來模擬標準庫中的功能。我已經測試了所有這些工具,除了最後一個「刪除」功能外,它們都可以工作。模仿從標準模板庫中刪除的功能無法正常工作

template <typename T> 
T* remove(T *left, T *right, T &item) 
{ 
    T *element = left; // Need a pointer to the element we are manipulating 
    int GoAhead; // How much in advance is the next element to check 
    T *finalElement = right; // The new final pointer of the array. 

    while(element < right) 
    { 
    if(*element == item) 
    { 
     GoAhead = 0; 
     while(element + GoAhead < finalElement) 
     { 
     T *tempElement = element + GoAhead; 
     *tempElement = *(tempElement + 1); 
     ++GoAhead; 
     } 
     --finalElement; 
    } 
    ++element; 
    } 
    return finalElement; 
} 

它運作良好,當陣列雖小,但是當數組有很多元素(在測試中,我們給出了10萬個的元素數組)由於某種原因,它忽略了一些應該刪除的元素。我不明白爲什麼會發生這種情況。 有人可以指出我做錯了嗎?

+0

應該將'while(element

+0

我嘗試了兩種方法,他們給出了相同的結果。我認爲(元素 blastxu

+1

另一個問題是您應該測試新的當前項目是否相等,而不是遞增到下一個,以防您有兩個或更多個匹配項目。 –

回答

1

您的功能對[2,2,1,1,2,1,0,0,1,2]不起作用,更不用說100000個元素的數組了。如果你真的模仿標準庫中的那些元素,那麼通過將下一個元素替換爲不等於val的元素來替換比較相等的元素會更簡單,並且通過返回指向元素的指針來指示縮小範圍的新大小應該被視爲其新的過去端元:

template <typename T> 
T* remove(T *left, T *right, const T &item) // you didn't modify the item, so add a const before it 
{ 
    T* result = left; 
    while (left!=right) { 
     if (!(*left == item)) { 
      *result = *left; 
      ++result; 
     } 
     ++left; 
    } 
    return result; 
} 

它返回一個指向該範圍新結尾的指針。