此代码适用于 CS 235 类,但我是 C++ 新手,我不知道他们希望我如何执行此操作。增长函数的工作原理是接收一个数组并将其更改为原来的两倍。来自python,我想这相当于改变数组? 无论如何,我无法让它对插入功能做同样的事情。我需要它来检查我们尝试插入项目的位置是否在数组边界之外,并使数组足够大以便可以插入值。一切正常......在函数内。数组不维护函数外部的更改。我尝试过将它作为指针传递,作为(对指针的引用?)如*&array,以及基本上我能想到的任何组合。
void grow(int *&original_array, unsigned int & capacity){
int *temp = new int[capacity * 2];
for (int i=0; i<capacity*2; i++){
temp[i] = 0;
}
std::cout << "line 18: ";
print_array(temp, capacity*2);
for(int i=0; i<capacity; i++){
temp[i] = original_array[i];
}
std::cout << "line 23: ";
print_array(temp, capacity*2);
// delete[] original_array;
original_array = temp;
std::cout << "line 27: ";
print_array(original_array, capacity * 2);
capacity = capacity * 2;
}
bool insert (int array[], unsigned int & maxSize, unsigned int & nFilled, unsigned int pos, int value){
while (maxSize < pos){
grow(array, maxSize);
print_array(array, maxSize);
}
for(unsigned int i = nFilled - 1; i >= pos; i = i-1){
array[i+1] = array[i];
}
array[pos] = value;
print_array(array, maxSize);
return true;
}
这是一些示例输入以及我的程序现在输出的内容:
int main() {
unsigned int my_size = 4;
int new_array[4] = {1,2,3,4};
unsigned int nFilled = 4;
insert(new_array, my_size, nFilled, 5, 15);
print_array(new_array, my_size);
return 0;
}
输出:
line 18: {0, 0, 0, 0, 0, 0, 0, 0}
line 23: {1, 2, 3, 4, 0, 0, 0, 0}
line 27: {1, 2, 3, 4, 0, 0, 0, 0}
{1, 2, 3, 4, 0, 0, 0, 0}
{1, 2, 3, 4, 0, 15, 0, 0}
{1, 2, 3, 4, -152629248, 32758, 0, 8}
倒数第二行在函数内部,最后一行在函数外部。我需要这些相同
感谢任何帮助 - 助教和教授没有提供帮助
谢谢
最佳答案
您的代码按编写方式工作有两个问题,第一个是您无法按照编写方式重新分配 main 中 new_array
的值。正如所写,它不是动态分配的,因此不能更改。您需要将其更改为动态分配:
int* new_array = new int[4];
for(int x = 0; x < 4; ++x)
{
new_array[x] = x + 1;
}
这将解决一个问题,但是代码仍然无法工作,这与变量如何传递给insert
和grow<有关
.
您的 grow()
函数采用 int*&
对整数指针的引用。这意味着传入的基础值可以更改。但是,您的 insert()
函数采用 int[]
一个整数数组,该数组会衰减为指向整数的指针,并且此处的更改不会反射(reflect)在 的调用站点上>插入()
。
您可以通过添加更多调试语句来验证这一点:
bool insert (int array[],
unsigned int & maxSize,
unsigned int & nFilled,
unsigned int pos,
int value)
{
// unchanged above...
std::cout << "Inside insert: " << array << '\n';
return true;
}
int main()
{
// unchanged above...
std::cout << "After insert: " << new_array << "\n";
print_array(new_array, my_size);
return 0;
}
您将得到类似于以下内容的输出:
line 18: {0 0 0 0 0 0 0 0 }
line 23: {1 2 3 4 0 0 0 0 }
line 27: {1 2 3 4 0 0 0 0 }
{1 2 3 4 0 0 0 0 }
{1 2 3 4 0 15 0 0 }
Inside insert: 0x548ed0
After insert: 0x548eb0
{1 2 3 4 0 0 49 0 }
请注意,数组“Inside insert”和“After insert”是不同的。
要解决此问题,您需要确保向 insert()
传递一些允许更改值的内容,类似于 grow()
所做的操作。
这种更改就像更改 insert()
的签名一样简单,如下所示:
bool insert (int *&array,
unsigned int & maxSize,
unsigned int & nFilled,
unsigned int pos,
int value)
请注意,insert()
的第一个参数已更改,以匹配 grow()
中对整数指针的引用的类型。现在,当我们将指针 new_array
传递给 insert()
时,会传递对该指针的引用(这允许更改值),并且也传递给grow()
(如果需要),允许它一直传播到调用站点。
请注意,这种方法存在风格问题——所有权语义不清晰、内存泄漏的可能性(存在于发布的代码中)等。
我还要警告,“重新发明”这种类型的数据结构而不是使用 std::vector
并不是一个好的做法,但是它确实有其用途教学环境。
关于c++ - 如何在函数内更改此数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75151920/