Quais são as implicações de executar uma cópia superficial em uma matriz, a fim de redimensioná-la?
-
10-07-2019 - |
Pergunta
Se o meu entendimento de cópia profunda e superficial é correta a minha pergunta é impossível. Se você tiver uma matriz (a [10]) e executar uma cópia superficial (b [20]) não isso seria impossível porque os dados em b não seria contígua?
Se eu tenho este completamente errado poderia alguém aconselhar uma maneira rápida de imitar (em c #) c ++ 's capacidade de fazer um realloc, a fim de redimensionar uma matriz.
NOTA
Im olhando para o .Clone () e .Copy () membros do objeto System.Array.
Solução
Você não pode redimensionar uma matriz existente, no entanto, você pode usar:
Array.Resize(ref arr, newSize);
Isso aloca uma nova matriz, copia os dados a partir da matriz de idade para a nova matriz, e actualizações do variáveis ??arr
(que é passada por-ref neste caso). É isso que você quer dizer?
No entanto, qualquer outros referências ainda apontando para a matriz de idade não será atualizado. A melhor opção poderia ser a de trabalhar com List<T>
- então você não precisa redimensioná-la manualmente, e você não tem a questão de referências out-of-date. Você só Add
/ Remove
etc. Geralmente, você não tendem a usar matrizes diretamente com muita frequência. Eles têm seus usos, mas eles não são o caso padrão.
Re seus comentários;
- Boxe:
List<T>
não caixa. Esse é um dos pontos sobre os genéricos; sob o capô,List<T>
é um invólucro em tornoT[]
, portanto, umList<int>
tem umaint[]
- não boxe. OArrayList
mais velho é um invólucro em tornoobject[]
, de modo que faz caixa; é claro, boxe não é tão ruim quanto se poderia supor de qualquer maneira. - funcionamento do
Array.Resize
;, se bem me lembro, ele encontra o tamanho deos detalhes reais estão escondidos por uma chamada interna - mas, essencialmente, após a atribuição de uma nova matriz é uma blit (memcpy) de os dados entre as duas matrizes, por isso deve ser muito rápido; Note-se que para referência tipos esta só copia a referência, e não o objecto na pilha. No entanto, se você está redimensionando regularmente,T
, em seguida, utilizaBuffer.BlockCopy
para blit o conteúdoList<T>
normalmente seria muito mais simples (e mais rápido a menos que você, basicamente, re-implementar o queList<T>
faz re capacidade ociosa para minimizar o número de redimensiona).