C++ 是否从指向的数组中删除数字?
我的这个小项目让我很为难;有人能帮我吗?我试图获取一个指向数组的指针,一个数字,如果该数字存在于数组中,则将其删除。如果删除该数字,阵列将缩小请在运行removeNumber size=6时注意。 现在是原型: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
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();
}