模仿从标准模板库中删除的函数无法正常工作
Function that mimics remove from standard template library doesn't work correctly
在大学的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;
}
返回一个指向该范围新结束的指针
相关文章:
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 为什么STD ::计数将常数传递给Lambda,而不是在弦上工作时而不是字符
- C++程序已停止工作-求解常微分方程