如果我对深复制和浅复制的理解是正确的,那么我的问题是不可能的。如果您有一个数组 (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; 如果我记得的话,它会找到大小 T, ,然后使用 Buffer.BlockCopy blit 内容 实际的细节是通过内部调用隐藏的 - 但本质上在分配一个新数组之后,它是两个数组之间数据的 blit (memcpy),所以它应该很快;请注意,对于引用类型,这仅复制引用,而不复制堆上的对象。但是,如果您定期调整大小, List<T> 通常会更简单(而且更快,除非你基本上重新实现什么 List<T> 是否重新预留容量以最大程度地减少调整大小的次数)。
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top