//此函数接受两个参数,一个Vec类型的向量和一个T类型的元素,并返回//与该参数匹配并成功从向量中删除的元素数。//其他元素的顺序应该保持不变。
//我已经将其添加到.h文件中,并尝试从test.cpp文件中调用此函数,行为:
int num_ele = remove_matching_elements(v, 22);
cout << num_ele << endl;
//其中v是{11,22,33,11,55,33}
template <class T> int remove_matching_elements(Vec<T>& v, const T& t) {
int counter = 0;
int i;
for(i = 0; i < v.size(); i++){
if(v[i] == t){
counter++;
while(i < v.size()-1){
v[i] = v[i+1];
}
v.resize(v.size()-1,0);
}
}
return counter;
}
while(i < v.size()-1){
v[i] = v[i+1];
}
由于i
在这里没有增加,因此结论是不可避免的:如果一开始i
小于v.size()-1
,它将永远保持不变,直到我们的太阳燃尽,从而产生一个无限循环:i
在这里从未改变,因此它永远小于v.size()-1
。这就是为什么你没有输出。
这似乎不是唯一的错误。所示的算法似乎在至少一个其他方面存在缺陷,并且在至少一种边缘情况下不会可靠地去除重复。但这将是一个不同的问题。
C++库有几个算法函数,可以在一行中完成所有这些;但我认为这是一个手工完成的课堂作业。您应该重新考虑基于迭代器的方法,这将使该实现更加简单可靠。