c++ - 从数组中删除元素的函数不起作用
问题描述
我想写一个函数,它在被调用时从数组中删除一个元素,因为deleteArray
函数中传递的参数是数组、它的长度和要删除的元素的值。
for
如果找到元素,则尝试在遍历数组时跳出循环,然后尝试使用i
循环,然后尝试在另一个循环中使用 ' 值for
将当前元素替换为下一个元素。
喜欢array[j] = array[j + 1]
这是代码:
#include <iostream>
using namespace std;
void deleteElement(int[], int, int);
int main() {
int array1[] = { 1, 4, 3, 5, 6 };
int length = sizeof(array1) / sizeof(array1[0]); //For length of array
deleteElement(array1, length, 4);
cout << "\nIn main function\n";
for (int i = 0; i < length; i++) {
cout << array1[i];
}
return 0;
}
void deleteElement(int array2[], int length, int element) {
int i = 0;
for (int i; i < length; i++) {
if (array2[i] == element) {
for (int j = i; j < length; j++) {
array2[j] = array2[j + 1];
}
break;
}
}
if (i == (length - 1)) {
cout << ("Element doesn't exist\n");
}
cout << "Testing OP in deleteElement\n";
for (int i = 0; i < length; i++) {
cout << array2[i];
}
}
预期的:
Testing OP in deleteElement
14356
In main function
1356
实际的:
Testing OP in deleteElement
14356
In main function
14356
解决方案
这个问题相当愚蠢:
在 的开头deleteElement()
,您使用 定义i
,但在每个循环中将int i = 0;
另一个变量重新定义i
为本地索引。循环引入了一个新的作用域,因此for
循环的第一个子句中的定义定义了一个 new ,它隐藏了在外部作用域中定义的同名变量。for
int i
for
i
for (int i; i < length; i++) {
而且您没有初始化这个新 i
变量。
有2个后果:
- 第一个循环中未定义的行为
i
未初始化。比较i < length
可能会立即失败。 - 测试
if (i == (length - 1)) {
测试外部i
变量,而不是for
迭代的变量。此外,该测试应if (i == length) {
还有其他问题:
嵌套
for
循环迭代一次太多次:当j == length - 1
,访问array[j + 1]
具有未定义的行为。你不更新
length
,所以数组的最后一个元素是重复的。您必须通过length
引用传递,以便它在调用者的范围内更新。
这是一个更正的版本:
#include <iostream>
using namespace std;
void deleteElement(int array2[], int& length, int element);
int main() {
int array1[] = { 1, 4, 3, 5, 6 };
int length = sizeof(array1) / sizeof(array1[0]); //For length of array
deleteElement(array1, &length, 4);
cout << "\nIn main function\n";
for (int i = 0; i < length; i++) {
cout << array1[i] << " ";
}
return 0;
}
void deleteElement(int array2[], int& length, int element) {
int i;
for (i = 0; i < length; i++) {
if (array2[i] == element)
break;
}
if (i == length) {
cout << "Element doesn't exist\n";
} else {
length -= 1;
for (; i < length; i++) {
array2[i] = array2[i + 1];
}
}
cout << "Testing OP in deleteElement\n";
for (i = 0; i < length; i++) {
cout << array2[i] << " ";
}
}
推荐阅读
- laravel - 我在同一个控制器中为同一个视图创建了 2 个函数,但最后一个路由的函数只工作
- php - Trigger action if entry(DateTimeZone) is wrong or empty
- python - 将pandas数据推送到R时,使用rpy2防止R从单个pandas列生成多个列的最佳方法是什么?
- javascript - 如何使用 JavaScript 更改 :lang 选择器样式
- regression - Pytorch 不更新 .step() 中的变量
- android - Google Places AutoCompleteFragment 主题更改
- tensorflow - TensorFlow 未编译为使用 AVX 5200
- php - 如何在 PHP 中取消对关联数组的排序?
- mysql - 从mysql字符串回显特殊字符不起作用
- javascript - Typescript 使用 D3.js 进行类型转换