问题描述:
如何对数组中的多个元素进行移除呢?比如原数组是int * pArr=new int[10] {3,5,1,11,99,66,22,2,8,6};如何移除下标为0和5的2个元素,要求过程中请注意节省内存空间。分析下面代码和结果,里面的offset是什么意思呢?
// Created by 黑马程序员.
#include "iostream"
using namespace std;
/* 移除下标0和5,2个元素*/
int main()
{
int * pArr = new int[10] {3, 5, 1, 11, 99,
66, 22, 2, 8, 6};
// 创建一个新数组
int * pNewArr = new int[8];
// for循环遍历老的数组,将需要的元素一个个的放入新数组中
int offset = 0; // 偏移量控制变量
for (int i = 0; i < 10; i++)
{
if (i == 0 || i == 5)
{
// 这两个元素是不要的
offset++; // 每跳过一个不要的元素,offset+1,可以让后续的元素减去offset得到准确的新数组内的下标
continue;
}
pNewArr[i-offset] = pArr[i];
}
// 将老数组的空间回收
delete[] pArr;
// 可选,将老数组的指针对象,指向新数组的空间
pArr = pNewArr;
// 将新数组的内容输出看一下
for (int i = 0; i<8; i++)
{
cout << pNewArr[i] << endl;
}
return 0;
}
D:\CLion_code\cmake-build-debug\CLion_code.exe
5
1
11
99
22
2
8
6
Process finished with exit code 0
问题解答:
要从一个数组中移除多个元素,比如从 int *pArr = new int[10]{3, 5, 1, 11, 99, 66, 22, 2, 8, 6}
中移除下标为 0
和 5
的元素,以下是实现过程和对代码的详细分析。
实现过程
移除数组中的多个元素的过程和之前移除单个元素类似,仍然涉及到将需要保留的元素复制到新数组中,并释放旧数组的内存。关键点在于:
- 通过动态内存分配创建一个新数组,容量为原数组长度减去要移除的元素个数。
- 使用一个偏移量变量(
offset
)来调整复制时的新数组下标。
代码分析
#include "iostream"
using namespace std;
/* 移除下标0和5,2个元素*/
int main()
{
int * pArr = new int[10]{3, 5, 1, 11, 99, 66, 22, 2, 8, 6};
// 创建一个新数组
int * pNewArr = new int[8]; // 由于要移除2个元素,新数组长度为8
// for循环遍历老的数组,将需要的元素一个个的放入新数组中
int offset = 0; // 偏移量控制变量
for (int i = 0; i < 10; i++)
{
if (i == 0 || i == 5) // 判断当前下标是否是要移除的元素
{
offset++; // 每跳过一个不要的元素,offset+1
continue; // 跳过当前元素
}
pNewArr[i-offset] = pArr[i]; // 复制需要保留的元素,注意使用偏移量调整新数组的下标
}
// 将老数组的空间回收
delete[] pArr;
// 可选,将老数组的指针对象,指向新数组的空间
pArr = pNewArr;
// 将新数组的内容输出看一下
for (int i = 0; i < 8; i++)
{
cout << pNewArr[i] << endl;
}
return 0;
}
代码解释
- 偏移量
offset
的作用:offset
用来调整新数组的下标位置。每当遇到一个要移除的元素(在本例中是下标为0
和5
的元素)时,offset
增加1
。在将旧数组的元素复制到新数组时,通过i-offset
计算新数组的正确下标。这样可以确保在跳过不需要的元素后,后续的元素能正确排列到新数组中。 - 新数组
pNewArr
的创建: 新数组的大小为8
,因为原数组有10
个元素,而我们移除了2
个元素,所以新数组的大小为10 - 2 = 8
。 - 释放旧数组内存: 使用
delete[] pArr
释放旧数组所占用的内存空间,避免内存泄漏。 - 指针重定向(可选): 通过
pArr = pNewArr;
可以将旧数组的指针指向新数组,这样后续的操作可以继续使用pArr
而不需要修改代码。
输出结果
运行程序后,新数组的内容为:
5
1
11
99
22
2
8
6
如预期,移除了原数组中下标为 0
(值为 3
)和下标为 5
(值为 66
)的两个元素,剩余元素按照顺序保存在新数组中。
结论
通过上述代码,您可以移除数组中的多个元素并重新调整数组的大小,同时使用偏移量 offset
确保新数组的元素顺序正确。这种方法在动态内存分配中节省了内存空间,并确保了操作的高效性。