微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在不制作数组副本的情况下从C数组中删除每一个值?

问题:我想得到一个数组A [6] = {6,5,4,3,2,1}为A [6] = {5,1,1}.换句话说 – “删除”每秒从0开始的第二个值,并将所有其他值向左移动.

我的尝试:

为此,我将使用此代码,其中a – 数组A的相关部分的长度(具有未删除元素的部分),ind – 我想要删除的值的索引.

for (int j = ind; j < n; j++)
    A[j] = A[j+1];

但是,使用这样的代码我无法使用它:

void deleting(int A[],int& a,int ind){
    for (int j = ind; j < a; j++)
        A[j] = A[j+1];

    a--;
}

int A[6] = {6,1};
a = 6

for (int i = 0; i < a; i+=2)
    deleting(A,a,i);

运行此代码后,我得到A [6] = {5,1507485184,1507485184}.因此,它删除了索引0,3处的元素.为什么删除第3个索引?

解决方法

有两种方法可以做到这一点:

>走完阵列,将最后的n-i个元素复制到每个偶数的一个位置,或者
>弄清楚最终的状态,然后直接去做.最终状态是第一个n / 2个位置是array [i] = array [2 * i 1],最后n / 2个位置只是最后一个元素的副本.

第一种方法是你要求的,但它做了多次冗余复制操作,第二种方法避免了.

至于你的实现问题,检查j = n-1时会发生什么,并记住A [n]不是数组的有效元素.我建议无论如何都要使copy-everything-forward操作成为自己的函数(或者你可以只使用memcpy)

原文地址:https://www.jb51.cc/c/117064.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐