从正在指向的数组中删除数字?

问题描述 投票:-3回答:3

我在这个小项目上遇到了困难;有人可以帮我吗?我正在尝试获取指向数组的指针,数字,如果数组中存在数字,则删除该数字。如果删除该数字,则阵列会缩小。请注意,在运行removeNumber size = 6时。

main
{
int size = 5;  // setting array size
int *a = new int[size]; // allocating dynamic array

// initializing array
a[0] = 0; a[1] = 10; a[2] = 20; a[3] = 30; a[4] = 40;

removeNumber(a, 10, size);
}

而现在的原型:

void removeNumber(int *& arrayPtr, int number, int &size)
{
    int index = check(arrayPtr, number, size);
    int *newArray = new int[size - 1];

    if (index != -1)
    {
        for (int i = number; i <= size; ++i)
            newArray[i] = *&arrayPtr[i + 1];

        delete[] arrayPtr;

        arrayPtr = newArray;

        size -= 1;
    }
}

检查参考:

int check(int *arrayPtr, int number, int size)
{
    for (int i = 0; i < size; i++)
    {
        if (arrayPtr[i] == number) return i;
    }
    return -1;
}
c++ pointers
3个回答
0
投票

功能错了。首先,如果在数组中找不到目标值,它会发生内存泄漏。

void removeNumber(int *& arrayPtr, int number, int &size)
{
    int index = check(arrayPtr, number, size);
    int *newArray = new int[size - 1];
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

    if (index != -1)
    {
        //...
    }
}

其次,使用了不正确的指数范围

   for (int i = number; i <= size; ++i)
                ^^^^^^  ^^^^^^^^^
        newArray[i] = *&arrayPtr[i + 1];
                                 ^^^^^^

你可以像*&arrayPtr[i + 1]一样写这个表达式arrayPtr[i + 1]更简单。

你忘了在索引index之前复制原始数组的元素。 number不是有效的指数。

此外,如果函数返回一个布尔值,表明操作是否成功,那会更好。如果调用成功,您可以在调用函数中更改数组的大小。

所以我会编写像这样的函数

bool removeNumber( int * &arrayPtr, int n, int value )
{
    int index = check( arrayPtr, number, size );

    if ( index != -1 )
    {
        int *tmp = new int[size - 1];

        int i = 0;

        for ( ; i < index; ++i ) tmp[i] = arrayPtr[i];
        for ( ; i < size - 1; i++ ) tmp[i] = arrayPtr[i+1];

        delete [] arrayPtr;

        arrayPtr = tmp;
    }

    return index != -1;
}

0
投票

可以重新发明轮子以便学习。但是你应该知道处理这个问题的标准方法:使用std::vectorstd::remove / std::remove_if(在#include <algorithm>中定义)可以让你的生活变得更加简单,并且有一个高性能的实现。

void removeNumber(std::vector<int>& vec, int number) {
    vec.erase(std::remove(std::begin(vec), std::end(vec), number),
              std::end(vec));
    // If you really want to shrink the vector, you can call...
    vec.shrink_to_fit();
}

我还做了一点demo,告诉你它按预期工作。


0
投票

你的问题在这里:

for (int i = number; i <= size; ++i)

首先,从您搜索的数字的值开始迭代(在您的情况下为10),因此您将不会进入for循环。因此,i的正确起始值是数组的第一个数字,即那么这行代码在这里:

newArray[i] = *&arrayPtr[i + 1];

甚至没有意义(作为一个思维过程不是语法上的),但我认为你想要做的只是将旧数组中的正确元素复制到新数组。

前面的正确实现是以下代码:

void removeNumber(int *& arrayPtr, int number, int &size)
{
    int index = check(arrayPtr, number, size);
    if (index != -1)
    {
        int *newArray = new int[size - 1];
        int i = 0,j=0; //i for the old array and j for the new
        while(i < size)//while we are in bounds
        {
            if(i==index)//if the index is the index of the given element
            {           //skip this number
                i++;
                continue;
            }
            newArray[j++] = arrayPtr[i++];//copy the correct number to the correct position
        }
        delete[] arrayPtr;

        arrayPtr = newArray;

        size -= 1;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.