模仿从标准模板库中删除的函数无法正常工作

Function that mimics remove from standard template library doesn't work correctly

本文关键字:常工作 工作 函数 标准模板库 删除      更新时间:2023-10-16

在大学的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;
}

当数组很小时,它工作得很好,但是当数组有很多元素时(在测试中我们给出100000个元素的数组),由于某种原因,它错过了一些应该擦除的元素。我真的不明白为什么会这样。谁能指出我哪里做错了吗?

你的函数对[2,2,1,1,1,2,1,0,0,1,2]不起作用,更不用说100000个元素的数组了。如果您真的要模仿标准库中的那些元素,那么用下一个不比较等于val的元素替换比较等于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;
}

返回一个指向该范围新结束的指针