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

前端之家收集整理的这篇文章主要介绍了如何在不制作数组副本的情况下从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)

猜你在找的C&C++相关文章