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

时间:2016-11-20 20:16:14

标签: c++ pointers

我在这个小项目上遇到了困难;有人可以帮我吗?我正在尝试获取指向数组的指针,数字,如果数组中存在数字,则删除该数字。如果删除该数字,则阵列会缩小。 请注意,在运行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;
}

3 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

你的问题在这里:

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

首先,你从你搜索的数字的值开始迭代(在你的情况下是10),因此你不会进入for循环。所以正确的起始值是i的第一个数字。数组是0.然后这行代码:

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;
    }
}

答案 2 :(得分:0)

可以重新发明轮子以便学习。但是,您应该了解处理此问题的标准方法:使用std::vector以及std::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 来告诉你它按预期工作。