C ++动态分配数组

时间:2009-11-24 23:10:53

标签: c++ arrays dynamic allocation

我正在做一些任务并且在这里陷入困境。 我正在尝试编写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;
    }
}

5 个答案:

答案 0 :(得分:1)

你有正确的想法,但实施可能会使用一点“肘部油脂”

试试这个:

保持2 int

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

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/

答案 1 :(得分:1)

向我跳出的一个问题是,您没有更改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返回后,您的列表指针仍将指向旧位置。

答案 2 :(得分:1)

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

  1. 它不会复制列表中的元素。
  2. 它不会将new_list的值分配给list
  3. 中的main变量
  4. 它从后面到前面插入值,而不是在最后一个值
  5. 之后插入值
  6. max_size未获得更新。很容易错过这个,因为你每次只增加一个数组的大小。这样,每次添加值时都需要分配。如果您将新大小增加一个以上,它仍然会每次都重新分配。
  7. 第一个问题可以通过更改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] << ". ";
        }
    }
    

答案 3 :(得分:0)

我会担心这一行:

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

和这一个:

list_new[i] = i;

答案 4 :(得分:-2)

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

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

更新:如上面my other answer所示,他的功能至少包含16行中的4个错误。这是每四行代码的错误。然后是代码设计存在问题。例如,数组的大小和数组本身应该在一起。您不能保证该功能有效。

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