问题描述:
如何对数组中的多个元素进行插入呢?比如原数组是 int * pArr = new int[5] {1, 3, 5, 7, 9};如何在下标1和3的位置分别插入数字11和66,要求过程中请注意节省内存空间。分析下面代码和结果,里面的offset是什么意思呢?
方法一:
// Created by 黑马程序员.
#include "iostream"
using namespace std;
/* 在下标1和3插入数字:11和66 */
int main()
{
// 示例数组
int * pArr = new int[5] {1, 3, 5, 7, 9};
// 创建新数组
int * pNewArr = new int[7];
// 循环新数组,挨个进行元素填充(非插入的位置,填充老数组元素,插入位置填充新元素)
int offset = 0; // 偏移量用来控制新老数组元素的下标对照
for (int i = 0; i < 7; i++)
{
if (i == 1)
{
// 走到了下标1,应当执行新元素插入
pNewArr[i] = 11;
offset++; // 每插入一个新元素,offset+1
continue;
} else if (i == 3)
{
// 走到了下标3,应当执行新元素插入
pNewArr[i] = 66;
offset++; // 每插入一个新元素,offset+1
continue;
}
// 不是插入位置,从老数组中提取元素放入新数组中
// 公式:老数组的元素下标 + offset = 新数组元素下标
// 当前循环的i是新数组的元素下标
pNewArr[i] = pArr[i-offset];
}
// 收尾工作
delete[] pArr;
pArr = pNewArr;
// 将新数组的内容输出
for (int i = 0; i< 7; i++)
{
cout << pNewArr[i] << ",";
}
return 0;
}
D:\CLion_code\cmake-build-debug\CLion_code.exe
1,11,3,66,5,7,9,
Process finished with exit code 0
代码功能
该代码的功能是将两个新元素 11
和 66
分别插入到原始数组 pArr
的下标 1
和 3
位置,并将其他元素适当地移位,最终生成一个包含新元素的数组 pNewArr
。
代码分析
-
数组创建:
- 创建了一个包含 5 个元素的原始数组
pArr
,其初始化为{1, 3, 5, 7, 9}
。 - 创建一个新数组
pNewArr
,大小为 7,用于存储插入新元素后的数组。
- 创建了一个包含 5 个元素的原始数组
-
元素插入和复制:
- 使用
for
循环遍历新数组pNewArr
,根据循环变量i
的值,决定是在对应位置插入新元素还是从原数组中复制元素。 offset
变量用于处理原数组中元素的位置偏移。每次插入一个新元素后,offset
会增加 1,这样可以保证后续从原数组中复制的元素位置正确。
- 使用
-
插入操作:
- 当
i == 1
时,插入新元素11
,并增加offset
。 - 当
i == 3
时,插入新元素66
,并增加offset
。 - 对于其他情况,从原数组中获取元素,将其放置在新数组的相应位置上。
- 当
-
内存管理:
- 释放旧数组
pArr
的内存空间,并将pArr
指向新数组pNewArr
。
- 释放旧数组
-
输出结果:
- 循环输出新数组
pNewArr
中的元素,以验证插入后的数组内容。
- 循环输出新数组
代码输出结果
代码执行后,程序的输出结果为:
1,11,3,66,5,7,9,
offset
变量的作用
offset
是一个控制偏移量的变量,用于管理新数组和旧数组之间的下标对照关系。- 每当插入一个新元素后,
offset
会增加 1,从而使后续元素的复制能够正确地跳过插入的新元素。 - 在
pNewArr[i] = pArr[i-offset];
这行代码中,i-offset
用于获取原数组pArr
中的对应元素。
总结
该代码成功地在指定位置插入了新元素,并生成了一个包含新元素的数组。通过使用 offset
变量,确保了原数组中的元素能够正确地移动,并插入了新元素。代码在内存管理方面也做得很好,避免了内存泄漏。
#######################################################
方法二:
为了在数组中插入多个元素,需要重新分配内存,并将原数组元素和新元素按顺序复制到新数组中。以下是具体的操作方法,并对您提供的代码进行分析,解释其中的 offset
含义。
实现插入操作的步骤
- 创建新数组: 新数组的大小应该是原数组大小加上插入元素的数量。
- 遍历原数组和插入位置: 根据插入元素的位置,将原数组的元素和新元素按顺序放入新数组中。
- 管理内存: 释放旧数组的内存,并将新数组的指针赋给旧数组指针。
代码示例
假设您要在下标 1
和 3
的位置插入数字 11
和 66
,可以使用如下代码实现:
#include "iostream"
using namespace std;
int main()
{
// 示例数组
int * pArr = new int[5] {1, 3, 5, 7, 9};
// 创建一个新数组,容量为原数组容量加上插入元素的数量
int * pNewArr = new int[7];
int offset = 0; // 偏移量控制变量
for (int i = 0; i < 5; i++)
{
// 插入11到下标1的位置
if (i == 1)
{
pNewArr[i+offset] = 11;
offset++; // 每插入一个新元素,偏移量加1
}
// 插入66到下标3的位置
if (i == 3)
{
pNewArr[i+offset] = 66;
offset++; // 再插入一个新元素,偏移量再加1
}
pNewArr[i+offset] = pArr[i];
}
// 将老数组的空间回收
delete[] pArr;
// 将老数组的指针对象,指向新数组的空间
pArr = pNewArr;
// 将新数组的内容输出看一下
for (int i = 0; i < 7; i++)
{
cout << pNewArr[i] << endl;
}
return 0;
}
代码解释
- 偏移量
offset
的作用:offset
用来调整新数组的下标。每当在指定位置插入一个新元素时,offset
就加1
,确保在复制原数组的元素时,新元素不会被覆盖,并且后续的元素能够正确排列到新数组中。 - 新数组
pNewArr
的创建: 新数组的大小为7
,因为原数组有5
个元素,并且需要插入2
个新元素,所以新数组的大小为5 + 2 = 7
。 - 内存管理: 旧数组的内存通过
delete[] pArr
被释放,避免内存泄漏。然后,将pArr
指向新数组,使得后续操作依然可以使用pArr
。
输出结果
运行程序后,新数组的内容应为:
1
11
3
66
5
7
9
如预期,在原数组 1, 3, 5, 7, 9
中下标 1
处插入了 11
,下标 3
处插入了 66
。
结论
通过偏移量 offset
的控制,我们能够灵活地在数组中插入多个元素,确保新数组中元素的位置正确排列。这样做不仅节省了内存空间,也使得数组操作更加灵活和高效。