C++中仅用数组删除指定元素的问题求助
解决数组中删除指定元素的问题
嘿,我来帮你搞定这个问题!你现在的代码确实只是统计了需要保留的元素数量,但还没实际完成元素的“删除”——其实对于普通数组来说,我们没法真正删除元素,只能把要保留的元素挪到数组的前半部分,然后记录新的长度就行。
核心思路:原地修改数组(无额外数组)
我们可以用一个索引变量来跟踪新数组的写入位置:遍历原数组时,只要当前元素不是要删除的值,就把它复制到当前的写入位置,然后把写入位置往后移一位。遍历结束后,这个写入位置的数值就是新数组的长度,数组的前N个元素就是我们要的结果。
修改后的完整代码
#include <iostream> using namespace std; void test() { int data[] = { 2, 1, 3, 2, 5, 2, 7, 8, 4, 9 }; int length = 10; int x = 2; // 跟踪新数组的写入位置,初始为0 int newIndex = 0; for (int i = 0; i < length; i++) { if (data[i] != x) { // 将需要保留的元素复制到新位置 data[newIndex] = data[i]; // 写入位置后移 newIndex++; } } // 输出结果长度 cout << "Size: " << newIndex << endl; // 打印验证结果数组 cout << "Result array: "; for (int i = 0; i < newIndex; i++) { cout << data[i] << " "; } cout << endl; } int main() { test(); return 0; }
代码解释
newIndex:一开始指向数组的第一个位置(索引0),每找到一个需要保留的元素,就把它放到data[newIndex],然后newIndex加1,相当于给下一个要保留的元素“占位置”。- 遍历结束后,
newIndex的值就是新数组的有效长度,数组前newIndex个元素就是删除指定值后的结果。 - 原数组中
newIndex之后的元素可以不用管,因为我们只关心前newIndex个有效元素。
如果你想保留原数组(使用临时数组)
如果不想修改原数组,你可以创建一个和原数组大小相同的临时数组,把需要保留的元素复制进去:
#include <iostream> using namespace std; void test() { int data[] = { 2, 1, 3, 2, 5, 2, 7, 8, 4, 9 }; int length = 10; int x = 2; int temp[10]; // 临时数组,和原数组大小一致 int newIndex = 0; for (int i = 0; i < length; i++) { if (data[i] != x) { temp[newIndex] = data[i]; newIndex++; } } cout << "Size: " << newIndex << endl; cout << "Result array: "; for (int i = 0; i < newIndex; i++) { cout << temp[i] << " "; } cout << endl; } int main() { test(); return 0; }
这样处理后,原数组data不会被修改,结果存在temp数组里,同样符合你“仅使用数组”的要求。
用这个方法测试你提到的例子:输入数组{1,2,3,1,2,3,1},删除值为3的元素,最终会得到前5个元素是{1,2,1,2,1},长度为5,完全符合预期。
内容的提问来源于stack exchange,提问作者Claudio Alfaro
相关产品推荐
相关产品推荐

