繁体   English   中英

如何更改 function 中的这个数组?

[英]How do I change this array inside the function?

此代码适用于 CS 235 class,但我是 C++ 的新手,我不知道他们希望我如何执行此操作。 grow function 的工作原理是接收一个数组并将其更改为两倍大。 来自 python,我想这相当于改变数组? 无论如何,我不能让它对插入 function 做同样的事情。我需要它来检查我们试图插入一个项目的 position 是否在数组边界之外,并使数组足够大以便它可以插入价值。 一切正常....在 function 内。数组不维护 function 之外的更改。我尝试将它作为指针传递,作为(对指针的引用?)像 *&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;
}

Output:

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}

倒数第二行在 function 内部,最后一行在 function 外部。我需要它们相同

任何帮助表示赞赏 - 助教和教授都没有帮助

谢谢

您的代码按照编写的方式工作有两个问题,第一个是您无法按照编写的方式在 main 中重新分配new_array的值。 如所写,它不是动态分配的,因此无法更改。 您需要将其更改为动态分配:

int* new_array = new int[4];

for(int x = 0; x < 4; ++x)
{
    new_array[x] = x + 1;
}

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

您的grow() function 采用int*&指向指向 integer 的指针的引用。这意味着传入的基础值可以更改。 但是,您的insert() function 采用int[]一个 integer 数组,该数组衰减为指向 integer 的指针,并且此处的更改不会反映在insert()的调用站点。

您可以通过添加更多调试语句来验证这一点:

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;
}

您将获得类似于此的 output:

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()中指向 integer 的指针的类型。现在,当我们将指针new_array传递给insert()时,将传递对该指针的引用(这允许值是改变了),并且它也被传递给grow() (如果需要),允许它一直传播到调用站点。

请注意,尽管这种方法存在风格问题——所有权语义不明确、memory 泄漏的可能性(出现在发布的代码中)等。

我还要警告“重新发明”这种类型的数据结构而不是使用std::vector不是一个好的做法,但是它在教学环境中确实有其用途。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM