如何动态增加数组大小?

12

我一直在尝试编写一个程序,可以将两个不同大小的数组相加。但我想知道如何动态增加数组的容量大小?例如:从array[4]升级到2以使array[6];? 编辑:不使用向量

我尝试创建一个新的指针,但它无法工作。我收到错误消息:只读变量不可赋值。

int *ptr2 = new int[a2.size];


            // new ptr2 copies ptr1
            for (int i=0; i<(a1.size); i++) {
                ptr2[i] = a1.ptr[i];
            }


            // we want ptr1 to point to ptr2
            for (int i=0; i<(a2.size); i++) {
                ptr2[i] += a2.ptr[i];
            }

            delete [] a1.ptr;

            a1.ptr=ptr2;

5
为什么不使用向量?它可以做到你想要的。 - vidit
3
我不想使用向量。我应该在哪里分配新的内存?为什么你会这么快地给出负面评价? - EEstud
@EEstud - 你可以在构造函数中分配内存。而且我还没有对这个问题进行投票..但是。 - vidit
可能是Can you resize a C++ array after initialization?的重复问题。 - Archmede
5个回答

22

您无法更改数组的大小,但是您并不需要这样做。您只需要分配一个更大的新数组,复制要保留的值,删除原始数组,并将成员变量指向新数组即可。

  1. 分配一个new[]数组并将其存储在临时指针中。

  2. 复制先前要保留的值。

  3. 删除旧数组。

  4. 更改成员变量 ptrsize 指向新数组并保存新大小。


4
使用 new[] 分配的内存块不能使用 realloc 进行重新分配。 - David Schwartz
这是一个很好的观点,我实际上没有看代码,假设是C语言...我的错误。 - Ed S.
1
同样作为一般规则,不要混合使用new/delete和*alloc/free。 - Dennis Meng
如果他的类型是POD,他可以切换到malloc/free,或者更好的方法是直接使用vector。最终,你需要学会如何正确地使用所有这些东西。 - David Schwartz
1
除了作为学习经验之外,不要使用new/delete。C++有智能指针和容器类。 - HAL9000
显示剩余2条评论

11
   int* newArr = new int[new_size];
   std::copy(oldArr, oldArr + std::min(old_size, new_size), newArr);
   delete[] oldArr;
   oldArr = newArr;

考虑到std::vector已经存在,而且OP特别寻找处理指针并尝试实现stl中已有内容的低级代码,为什么您会在回答中更喜欢使用std::copy而不是for循环? - Silidrone

0
#include<bits/stdc++.h>
using namespace std;

main(){
    
    int *p = new int[5]; // locate memory in heap
    int *q = new int[10];// locate memory in heap
    
    for(int j=0; j<5;j++)
        p[j] = j;
    
    for(int i=0; i<5;i++)
        q[i] = p[i];
        
    delete []p;//Delete the old array 'p'
    p = q; // Assign the pointer of 'q' to 'p'
    q = NULL; // delete the location of pointer 'q'
    
    return 0;
}

0
可能有点晚回答,但我会向你解释一些东西。
由于在内存中进行连续的内存分配,所以数组大小无法增加。 例如 => 每个位置的地址是
arr[5] => [2001,2002,2003,2004,2005]
现在,主要的问题是如果将其分配给 arr[10],因为我们不知道下一个位置 2006 是否空闲。 因为数组需要连续,所以我们将无法分配内存。
从我的建议中,使用 Vector 或使用 Cpp 中的动态内存分配。
int *old = new int[5];
int *nw = new int[10];

for (size_t i = 0; i < sizeof(old); i++)
    nw[i] = old[i];

delete []old;
old = nw;
nw = NULL;

-1
#include <stdio.h>
#include <stdlib.h>
int main()
{
int *p,*q;
int i;
p=(int *)malloc(5*sizeof(int));
p[0]=3;p[1]=5;p[2]=7;p[3]=9;p[4]=11;
q=(int *)malloc(10*sizeof(int));
for(i=0;i<5;i++)
q[i]=p[i];
free(p);
p=q;
q=NULL;
for(i=0;i<5;i++)
printf("%d \n",p[i]);
return 0;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接