模拟从标准模板库中删除的功能无法正常工作

时间:2014-03-27 01:31:38

标签: c++ arrays templates range

在大学的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个元素的数组)由于某种原因它错过了它应该擦除的一些元素。我真的不明白为什么会这样。 有人能指出我做错了吗?

1 个答案:

答案 0 :(得分: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;
}

它返回指向该范围新结束的指针。