C++ 如何在C++;?{like in vector}

C++ 如何在C++;?{like in vector},c++,arrays,dynamic,expand,C++,Arrays,Dynamic,Expand,比如说,我有 int *p; p = new int[5]; for(int i=0;i<5;i++) *(p+i)=i; int*p; p=新整数[5]; 对于(int i=0;i如果使用malloc分配初始缓冲区,则可以使用realloc调整缓冲区大小。不应使用realloc调整新的-ed缓冲区大小 int * array = (int*)malloc(sizeof(int) * arrayLength); array = (int*)realloc(array, sizeof

比如说,我有

int *p;
p = new int[5];
for(int i=0;i<5;i++)
   *(p+i)=i;
int*p;
p=新整数[5];

对于(int i=0;i如果使用
malloc
分配初始缓冲区,则可以使用
realloc
调整缓冲区大小。不应使用
realloc
调整
新的
-ed缓冲区大小

int * array = (int*)malloc(sizeof(int) * arrayLength);
array = (int*)realloc(array, sizeof(int) * newLength);

但是,这是一种C-Y的做事方式。你应该考虑使用<代码>向量< /> > .< /p> 你必须重新分配数组并复制数据:

int *p;
p = new int[5];
for(int i=0;i<5;i++)
   *(p+i)=i;

// realloc
int* temp = new int[6];
std::copy(p, p + 5, temp); // Suggested by comments from Nick and Bojan
delete [] p;
p = temp;
int*p;
p=新整数[5];

对于(int i=0;i您不能这样做。您必须使用动态容器,例如STL向量。否则,您可以创建另一个更大的数组,然后将第一个数组中的数据复制到其中


原因是数组表示内存中的一个连续区域。对于上面的示例,让我们假设p指向地址0x1000,五个整数对应于二十个字节,因此数组结束于0x1014的边界。编译器可以在内存中自由放置从0x1014开始的其他变量;例如,
int i
m无法占用0x1014..0x1018。如果扩展阵列,使其再占用四个字节,会发生什么情况?

与其他人所说的相同,但如果经常调整阵列大小,一种策略是每次通过将大小加倍来调整阵列的大小。不断创建新的和销毁旧的会产生费用,因此倍增理论尝试为了确保这个问题,确保有足够的空间来容纳未来元素。

为什么不查看源代码<代码>向量< /代码>?你可以看到这个机制的实现正好在你的C++文件驻留的文件夹中。

以下是它在gcc 4.3.2中的作用:

  • 使用vector的分配器(您记得vector是
    vector
    ?)分配一个新的连续内存块。默认分配器调用
    operator new()
    (不仅仅是
    new
    !)来分配这个内存块,这样他就不会弄乱
    new[]
    /
    delete[]
    东西

  • 将现有数组的内容复制到新分配的数组中

  • 使用分配器处理先前对齐的块;默认块使用
    operator delete()


  • (请注意,如果您要编写自己的向量,那么您的大小应该增加“M倍”,而不是“固定数量”。这将使您实现摊余固定时间。例如,如果每次超出大小限制,您的向量将增长两次,则每个元素将平均复制一次。)

    如果你在编辑器中缩进四个空格,你的代码看起来像是代码,你不需要。如果你想要这种功能,你可以使用<代码> STD::向量< /代码>。如果你不使用<代码> STD::vector < /C> >,你应该知道很多关于C++的东西(既然你问这个,你可能还没有足够的)你应该有一个很好的理由。根据这个原因,答案可能会有所不同。这基本上是重新实现向量,不是吗?如果你不想要向量,这就是你可以做的。但是,如果你实现向量,你就不会问这个问题。这对于“int”类型很好,但是对于用户定义的类型,
    memcpy/delete[]
    方法可能会导致问题。您可以使用std::copy而不是memcpy-它将适用于POD以及具有用户定义赋值运算符的对象,并且很可能针对整数类型将其优化为memcpy。但是,优化是一个实现质量问题。谢谢大家,我改为std::copy。这是由于匿名用户拒绝的编辑。感谢您找到该错误!当我在不检查参数顺序的情况下从memcpy更改为std::copy时,它悄悄出现。@JeremyTrifilo该问题是针对用户定义的类型提出的。如果您有一个带有用户定义的赋值运算符的对象数组(例如,它们需要释放/分配私有内存),
    memcpy
    将中断,因为它只会blit字节,而不是调用每个元素的赋值。仅适用于普通的旧数据类型。如果vector想要模拟,您可能应该添加vector的作用是分配一个新的、更大的数组,并将元素复制到该数组中。OP知道vector,所以可能有n的原因ot使用它(可能是家庭作业)