对数组执行浅复制以调整数组大小有何含义?
-
10-07-2019 - |
题
如果我对深复制和浅复制的理解是正确的,那么我的问题是不可能的。如果您有一个数组 (a[10]) 并执行浅复制 (b[20]),这不是不可能的吗,因为 b 中的数据不连续?
如果我完全错了,有人可以建议一种快速的方法来模仿(在 C# 中)C++ 进行重新分配以调整数组大小的能力。
笔记
我正在查看 System.Array 对象的 .Clone() 和 .Copy() 成员。
解决方案
您无法调整现有数组的大小,但是,您可以使用:
Array.Resize(ref arr, newSize);
这会分配一个新数组,将旧数组中的数据复制到新数组中,并更新 arr
变量(在本例中通过-ref 传递)。你是这个意思吗?
然而,任何 其他 仍然指向旧数组的引用将不会被更新。更好的选择可能是与 List<T>
- 那么你不需要手动调整它的大小,并且你不会遇到过时引用的问题。你刚才 Add
/Remove
ETC。通常,您不会经常直接使用数组。它们有它们的用途,但它们不是默认情况。
回复您的评论;
- 拳击:
List<T>
不装箱。这是关于泛型的要点之一;在引擎盖下,List<T>
是一个包装器T[]
, ,所以一个List<int>
有一个int[]
- 没有拳击。年龄较大的ArrayList
是一个包装器object[]
, , 以便 做 盒子;当然是拳击 并不像你想象的那么糟糕 反正。 - 的运作方式
Array.Resize
;如果我记得的话,它会找到大小实际的细节是通过内部调用隐藏的 - 但本质上在分配一个新数组之后,它是两个数组之间数据的 blit (memcpy),所以它应该很快;请注意,对于引用类型,这仅复制引用,而不复制堆上的对象。但是,如果您定期调整大小,T
, ,然后使用Buffer.BlockCopy
blit 内容List<T>
通常会更简单(而且更快,除非你基本上重新实现什么List<T>
是否重新预留容量以最大程度地减少调整大小的次数)。
不隶属于 StackOverflow