繁体   English   中英

C ++动态分配数组

[英]C++ dynamic allocated array

我正在做一些作业,被困在这里。 我正在尝试编写一个list_add()函数。 它的第一个功能是将值添加到数组。 它的第二个功能是增加阵列的大小。 因此,它的工作原理很像向量。 如果我做对了,我不知道。 我试图创建一个比旧数组更大的新动态分配数组,然后将所有值复制到新数组中。

这是正确的方法吗?

这是主体

int main()
{
    const int N = 7;

    //declaring dynamic array allocation
    int* list = new int[N];

    int used = 0, a_val;
    for(int i=0;i<11;i++)
    {
        list_add(list, used, N, i);
    }

    cout << endl << "Storlek: " << N << endl << endl;
    cout << "Printar listan " << endl;
    for(int i=0;i<used;i++)
    {
        cout << list[i] << ". ";
    }

}

这是功能

bool list_add(int *list, int& space_used, int max_size, int value)
{

    if(max_size-space_used > 0)
    {
        *(list+(max_size-space_used-1)) = value;
        space_used++;
        return true;
    }
    else
    {
        cout << "Increasing size of array!" << endl;
        int new_max_size = space_used+1;
        delete [] list;
        int *list_new = new int[new_max_size];

        for(int i=0; i<new_max_size; i++)
        {
            list_new[i] = i;
            cout << list_new[i] << ". ";
        }
        cout << endl;
        space_used++;
        list = list_new;
        return false;
    }
}

您有正确的想法,但实施过程中可能会使用一些“手肘油脂”

尝试这个:

保持2 int

容量-您分配的长度
大小-数组的当前结尾

if capacity <= size:
   make new list( size = capacity x 2 )
   memcopy old list into new list -> if you can't memcopy, copy over the data one-by-one
   delete old list
if capacity > size:
   list[size] = value
   size++

http://www.cplusplus.com/reference/clibrary/cstring/memcpy/

让我惊讶的一个问题是,您没有在list_add函数的作用域之外更改列表指针的值。 您应该进行一些更改,例如...

bool list_add(int *list, int& space_used, int max_size, int value)

变成

bool list_add(int **list, int& space_used, int max_size, int value)

list = list_new

变成

*list = list_new

否则,我认为您会发现,当您重新分配列表时,从list_add返回后,列表指针仍将指向旧位置。

您的代码的实现存在四个问题:

  1. 它不会复制列表的元素。
  2. 它并不值分配new_listlist中的变量main
  3. 它从后到前插入值,而不是最后一个值之后
  4. max_size不会更新。 很容易错过这一点,因为您每次仅将数组的大小增加一。 这样,每次添加值时都需要分配。 如果将新大小增加一倍,则每次仍将重新分配。

第一个问题可以通过更改list_add的for循环来解决,以便进行复制:

for (int i = 0; i < space_used; i++) {   // this also changed.
    list_new[i] = list[i];
    cout ...
}
// insert the new value (in the front?)
list_new[max_size-space_used-1] = value;     
delete [] list;         // Delete the list afterwards instead of earlier.

第二个问题可以通过返回指向列表的指针来解决。 main功能更改为此:

for (int i = 0; i < 11; i++) {
    list = list_add(list, used, N, i); 
} 

第三个问题可以通过更改此行来解决

list_new[max_size-space_used-1] = value;

list_new[space_used++] = value;

您还应该在此之后删除space_used++

要查看第四个问题,您应该更改此行

int new_max_size = space_used+1;

int new_max_size = space_used+3;

每次仍将重新分配。 但是,它应该只重新分配两次。


这是完整的代码:

#include <iostream>
using std::cout;
using std::endl;

int* list_add(int *list, int& space_used, int& max_size, int value) {
    if (max_size - space_used > 0) {
        list[space_used++] = value;
        return list;
    }
    else {
        cout << "Increasing size of array!" << endl;
        int new_max_size = space_used+1;

        int *list_new = new int[new_max_size];

        for (int i = 0; i < space_used; i++) {
            list_new[i] = list[i];
            cout << list_new[i] << ". ";
        }
        cout << endl;

        list_new[space_used++] = value;
        max_size=new_max_size;

        delete [] list;
        return list_new;
    }
}

int main() {
    int N = 7;

    //declaring dynamic array allocation
    int* list = new int[N];

    int used = 0, a_val;

    for (int i = 0; i < 11; i++) {
        list=list_add(list, used, N, i);
    }

    cout << endl << "Storlek: " << N << endl << endl;
    cout << "Printar listan " << endl;

    for (int i = 0; i < used; i++) {
        cout << list[i] << ". ";
    }
}

我会担心这一行:

*(list+(max_size-space_used-1)) = value;

还有这个:

list_new[i] = i;

要知道如何解决问题,有很多话要说,但这不是其中之一。

#include <vector>
#include <iostream>

int main() 
{
    std::vector<int> numbers;

    for (int i = 0; i < 11; i++) {
        numbers.push_back(i);
    }

    for (int i = 0; i < numbers.size(); i++) {
        std::cout << numbers[i] << ". ";
    }

    std::cout << "\n";
}

更新 :如上我的另一个答案所示,他的函数在16行中包含至少四个bug。 这是每四行代码的错误。 然后是代码设计的问题。 例如,数组的大小和数组本身应该在一起。 否则,您不能保证该功能正常运行。

通过使用包含数组指针和数据结构的max_size的struct ,可以解决代码(2,4)中的两个问题。 这样,您必须将两个变量一起传递。

暂无
暂无

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

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