如何对数组中的多个元素进行移除呢?里面的offset是什么意思呢?

问题描述:

如何对数组中的多个元素进行移除呢?比如原数组是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} 中移除下标为 05 的元素,以下是实现过程和对代码的详细分析。

实现过程

移除数组中的多个元素的过程和之前移除单个元素类似,仍然涉及到将需要保留的元素复制到新数组中,并释放旧数组的内存。关键点在于:

  1. 通过动态内存分配创建一个新数组,容量为原数组长度减去要移除的元素个数。
  2. 使用一个偏移量变量(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 用来调整新数组的下标位置。每当遇到一个要移除的元素(在本例中是下标为 05 的元素)时,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 确保新数组的元素顺序正确。这种方法在动态内存分配中节省了内存空间,并确保了操作的高效性。

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
利用 SSE 指令集对数组中个元素进行同时计算,可以使用 SSE 指令集提供的加减乘除指令。下面是一个使用 SSE 指令集对数组中个元素进行加法计算的例子: ```c++ #include <iostream> #include <emmintrin.h> // SSE2 int main() { float arr[4] = {1.0f, 2.0f, 3.0f, 4.0f}; __m128 vec = _mm_loadu_ps(arr); // 将 arr 中的 4 个 float 数据加载到 SSE 寄存器 vec 中 __m128 add_vec = _mm_set_ps1(1.0f); // 创建一个包含 4 个 1.0f 的 SSE 寄存器 add_vec __m128 result_vec = _mm_add_ps(vec, add_vec); // 将 vec 和 add_vec 中的数据进行加法运算,结果存储到 result_vec 中 float result[4]; _mm_storeu_ps(result, result_vec); // 将 result_vec 中的数据存储到 result 数组中 for (int i = 0; i < 4; i++) { std::cout << result[i] << " "; } return 0; } ``` 在这个例子中,我们首先定义了一个包含 4 个 float 类型数据的数组 arr,然后使用 _mm_loadu_ps 函数将 arr 中的数据加载到 SSE 寄存器 vec 中。接着使用 _mm_set_ps1 函数创建了一个包含 4 个 1.0f 的 SSE 寄存器 add_vec。然后使用 _mm_add_ps 函数将 vec 和 add_vec 中的数据进行加法运算,结果存储到 result_vec 中。最后,使用 _mm_storeu_ps 函数将 result_vec 中的数据存储到 result 数组中。遍历 result 数组,输出了计算结果。 需要注意的是,使用 SSE 指令集进行计算时,也需要注意数据对齐的问题,否则可能会导致程序崩溃或数据错误。此外,SSE 指令集提供的计算精度较高,可以提高计算精度和效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神笔馬良

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值