2

如果我对深浅复制的理解是正确的,那么我的问题是不可能的。如果你有一个数组(a[10])并执行一个浅拷贝(b[20]),这不是不可能的,因为 b 中的数据不是连续的吗?

如果我完全错了,有人可以建议一种快速的方法来模仿(在 c# 中)c++ 执行 realloc 以调整数组大小的能力。

注意
我正在查看 System.Array 对象的 .Clone() 和 .Copy() 成员。

4

1 回答 1

4

您无法调整现有数组的大小,但是,您可以使用:

Array.Resize(ref arr, newSize);

这会分配一个新数组,将旧数组中的数据复制到新数组中,然后更新arr变量(在这种情况下是通过-ref 传递的)。你是这个意思吗?

但是,仍然指向旧数组的任何其他引用都不会更新。更好的选择可能是使用List<T>- 然后您不需要手动调整它的大小,并且您不会遇到过时引用的问题。你只是Add/Remove等等。一般来说,你不会经常直接使用数组。它们有其用途,但它们不是默认情况。


重新发表您的意见;

  • 拳击:List<T>不拳击。这是关于泛型的要点之一;在引擎盖下,List<T>是一个包装器T[],所以 aList<int>有一个int[]- 没有拳击。较旧的ArrayList是一个包装器object[],所以盒子也是如此;当然,拳击并不像你想象的那么糟糕
  • 的工作Array.Resize如果我记得,它会找到 的大小T,然后用于Buffer.BlockCopyblit 内容,实际细节被内部调用隐藏 - 但本质上在分配一个新数组之后,它是两个数组之间数据的 blit (memcpy),所以它应该很快;请注意,对于引用类型,这仅复制引用,而不是堆上的对象。但是,如果您定期调整大小,List<T>通常会更简单(并且更快,除非您基本上重新实现List<T>重新备用容量以最小化调整大小的数量)。
于 2009-01-11T10:08:17.223 回答