Quais são as implicações de executar uma cópia superficial em uma matriz, a fim de redimensioná-la?

StackOverflow https://stackoverflow.com/questions/432672

  •  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.

Foi útil?

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 torno T[], portanto, um List<int> tem uma int[] - não boxe. O ArrayList mais velho é um invólucro em torno object[], 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 de T, em seguida, utiliza Buffer.BlockCopy para blit o conteúdo os 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, List<T> normalmente seria muito mais simples (e mais rápido a menos que você, basicamente, re-implementar o que List<T> faz re capacidade ociosa para minimizar o número de redimensiona).
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top