Qual é o equivalente em C # do vetor C ++?
Estou procurando este recurso:
Para ter uma matriz dinâmica de memória armazenada de forma contígua, sem penalidade de desempenho para acesso em comparação com matrizes padrão.
Eu estava procurando e eles dizem .NET equivalent to the vector in C++ is the ArrayList
, então:
ArrayList tem esse recurso de memória contígua?
Respostas:
Você poderia usar um
List<T>
e quandoT
for um tipo de valor, ele será alocado na memória contígua, o que não seria o caso seT
fosse um tipo de referência.Exemplo:
List<int> integers = new List<int>(); integers.Add(1); integers.Add(4); integers.Add(7); int someElement = integers[1];
fonte
List<T>
classe contém muitos exemplos, mas atualizei minha resposta para incluir um.T
for um tipo de referência, você ainda terá memória contígua. É basicamente uma série de indicadores ...T[]
... o OP pediu "nenhuma penalidade de desempenho para acesso vs. matrizes padrão", eList<T>
fornece isso. E seT
for um tipo de referência, é análogo aT*
em C ++, então você obtém tanta contiguidade quanto em C ++. Se alguém deseja que os próprios objetos sejam contíguos, então é claro que são necessários tipos de valor ... em ambas as línguas. A diferença, claro, é que em C ++ qualquer tipo pode ser usado como valor ou ref, enquanto em C # é uma propriedade do tipo por meio da distinção de classe / estrutura.List<T>
é sempre implementado como uma lista vinculada internamente. Então, como ele se expande dinamicamente quando chamamosAdd()
? Algo como o VB6Redim Preserve
que costumava copiar todo o array para um novo local?List<T>
cria internamente um pequeno arrayT[]
. Os itens internamente são adicionados ao array. Assim que o tamanho da matriz for concluído, uma nova matriz será criada com o dobro do tamanho da anterior. Os dados são copiados para o novo array maior, o menor é destruído e assim por diante. Um programador pode dar uma pista para .NET para criar uma matriz interna suficientemente grande, antes de encher aList
via construtor:new List<T>(expected_array_size)
.usar
List<T>
. Internamente, ele usa arrays e os arrays usam memória contígua.fonte
private T[] _items;
que é usado para armazenamento de backend, tipo de referência ou não.Em primeiro lugar, fique longe de
Arraylist
ouHashtable
. Essas classes devem ser consideradas obsoletas, em favor dos genéricos. Eles ainda estão no idioma para fins de legado.Agora, o que você está procurando é a
List<T>
classe. Observe que se T for um tipo de valor, você terá memória contínua, mas não se T for um tipo de referência, por motivos óbvios.fonte
C # tem muitos tipos de referência. Mesmo que um contêiner armazene as referências de forma contígua, os próprios objetos podem estar espalhados pelo heap
fonte
Parece que CLR / C # receberá melhor suporte para Vector <> em breve.
http://blogs.msdn.com/b/dotnet/archive/2014/04/07/the-jit-finally-proposed-jit-and-simd-are-getting-married.aspx
fonte