0

//这个函数接受两个参数,一个 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;
}
4

1 回答 1

1
  while(i < v.size()-1){
    v[i] = v[i+1];
  }

由于这里没有任何地方i增加,所以结论是不可避免的:如果一开始i小于v.size()-1,它将永远保持,直到我们的太阳熄灭,导致无限循环:i这里永远不会改变,所以它永远保持小于v.size()-1. 这就是为什么你没有输出。

这似乎不是唯一的错误。所示算法似乎至少在另一种方面存在缺陷,并且在至少一种边缘情况下不会可靠地删除重复项。但这将是一个不同的问题。

C++ 库有几个算法函数,可以在一行中完成所有这些操作;但我认为这是手动完成的课堂作业。你应该重新考虑你的方法是基于迭代器的,这将使这个实现更加简单和可靠。

于 2020-04-14T01:05:46.580 回答