c++ - 如何在函数内更改此数组?

标签 c++

此代码适用于 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;
}

这将解决一个问题,但是代码仍然无法工作,这与变量如何传递给insertgrow<有关.

您的 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/

相关文章:

c++ - 继承中的虚拟调用

c++ - 在 ostream '<<' 中使用 std::endl - 包含变体成员的可变参数模板类的运算符重载会导致编译器错误

c++ - 有符号到无符号转换,并返回,整数的定义行为?

c++ - C++中的基本问题

C++ 表达式 : string subscript out of range error

c++ - 重新缩放或缩放光标后的 qwt plot 移动曲线

c++ - 从“const char [2]”到非标量类型“Persona”的转换请求

c++ - 传递输入参数作为右值引用?

python - 如何包装按类型重载的函数?

c++ - GNU Make 因 If 语句中的语法错误而退出