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