C++ 是否从指向的数组中删除数字?

C++ 是否从指向的数组中删除数字?,c++,pointers,C++,Pointers,我的这个小项目让我很为难;有人能帮我吗?我试图获取一个指向数组的指针,一个数字,如果该数字存在于数组中,则将其删除。如果删除该数字,阵列将缩小请在运行removeNumber size=6时注意。 现在是原型: void removeNumber(int *& arrayPtr, int number, int &size) { int index = check(arrayPtr, number, size); int *newArray = new int[s

我的这个小项目让我很为难;有人能帮我吗?我试图获取一个指向数组的指针,一个数字,如果该数字存在于数组中,则将其删除。如果删除该数字,阵列将缩小请在运行removeNumber size=6时注意。

现在是原型:

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;
    }
}
void removeNumber(int*&arrayPtr,int number,int&size)
{
int index=检查(数组、数字、大小);
int*newArray=newint[size-1];
如果(索引!=-1)
{

对于(int i=number;i函数是错误的。首先,如果在数组中找不到目标值,它会出现内存泄漏

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];
                                 ^^^^^^
你的问题是:

for (int i = number; i <= size; ++i)
这甚至没有意义(作为一个思维过程,不是语法上的),但我认为您在这里要做的只是将正确的元素从旧数组复制到新数组

正确实现上述功能的代码如下:

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;
    }
}
void removeNumber(int*&arrayPtr,int number,int&size)
{
int index=检查(数组、数字、大小);
如果(索引!=-1)
{
int*newArray=newint[size-1];
int i=0,j=0;//i表示旧数组,j表示新数组
while(i
为了学习,可以重新设计轮子。但是,您应该知道处理这个问题的标准方法:使用
std::vector
std::remove
/
std::remove\u如果
(定义在
#include中,向您展示它的工作原理。

为什么不让您的生活更轻松,改用
std::vector
呢?重新发明轮子没有用(而且大多容易出错)。@Christian Vokurka有什么问题吗?循环
for(int i=number;我认为有一个输入错误:
delete[]tmp;
应该是
delete[]arrayPtr;
谢谢你的帮助!我当时很困惑,现在我想我明白了!@UnholySheep谢谢。这是一个输入错误。:@ChristianVokurka考虑到我在建议的函数实现中输入了一个输入错误。:)@邪恶羊我忘了抱歉,我更新了我的答案。谢谢你的反馈,我感谢你在这里花时间帮助愚蠢的我:P@ChristianVokurka我希望我的回答足够简单,可以帮助你理解你的错误。顺便说一下,你不应该说“
newArray[I]=*&arrayPtr[I+1];
根本没有意义”,这只是一种更为复杂的书写方式,
newArray[i]=arrayPtr[i+1];
(如弗拉德的回答所述)@UnholySheep我的意思是,这无助于op完成他想做的事情。这并不是说它在语法上是错误的。
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;
}
for (int i = number; i <= size; ++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;
    }
}
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();
}