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