c++ - 我正在向 .h 文件添加“模板化非成员函数”。添加以下代码后,为什么我的程序没有输出任何内容:
问题描述
//这个函数接受两个参数,一个 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++ 库有几个算法函数,可以在一行中完成所有这些操作;但我认为这是手动完成的课堂作业。你应该重新考虑你的方法是基于迭代器的,这将使这个实现更加简单和可靠。
推荐阅读
- javascript - 缩放后如何计算旋转的图像位置
- flutter - Flutter 忽略“if”分支内的 return 语句
- ios - 无法在 SwiftUI 中更改 NavigationBarItems 中菜单项的颜色
- c# - 试图覆盖 Powershell 类的索引器
- python - for 循环中的变量影响全局变量
- reactjs - 如果添加了新元素,单选按钮 onChange 事件不会触发
- php - Coinbase Pro 费用和总额
- javascript - 检查元素的一部分是否在视口中
- python - 如果我用 Popen 调用它,为什么 NCat 会立即结束?
- visual-studio - 在 x86 asm 中显示前 N 个斐波那契数