¿Cuál es el equivalente en C # del vector C ++?
Estoy buscando esta característica:
Tener una matriz dinámica de memoria almacenada de forma contigua que no tenga una penalización de rendimiento para el acceso frente a las matrices estándar.
Estaba buscando y dicen .NET equivalent to the vector in C++ is the ArrayList
, entonces:
¿ArrayList tiene esa característica de memoria contigua?
Respuestas:
Puede usar un
List<T>
y cuandoT
es un tipo de valor, se asignará en la memoria contigua, lo que no sería el caso si fueraT
un tipo de referencia.Ejemplo:
List<int> integers = new List<int>(); integers.Add(1); integers.Add(4); integers.Add(7); int someElement = integers[1];
fuente
List<T>
clase contiene muchos ejemplos pero he actualizado mi respuesta para incluir uno.T
es un tipo de referencia, todavía tendrá memoria contigua. Es básicamente una serie de consejos ...T[]
... el OP pidió "sin penalización de rendimiento para el acceso frente a matrices estándar", y loList<T>
proporciona. Y siT
es un tipo de referencia, eso es análogo aT*
en C ++, por lo que obtiene tanta contigüidad como en C ++. Si uno quiere que los objetos en sí sean contiguos, entonces, por supuesto, necesita tipos de valores ... en ambos idiomas. La diferencia, por supuesto, es que en C ++ cualquier tipo puede usarse como valor o como referencia, mientras que en C # es una propiedad del tipo a través de la distinción clase / estructura.List<T>
que siempre se implementa como una lista vinculada internamente. Entonces, ¿cómo se expande dinámicamente cuando llamamosAdd()
? ¿Algo como VB6Redim Preserve
que solía copiar toda la matriz a una nueva ubicación?List<T>
crea internamente una pequeña matrizT[]
. Los elementos se agregan internamente a la matriz. Una vez que se completa el tamaño de la matriz, se crea una nueva matriz con el doble de tamaño que la anterior. Los datos se copian en la nueva matriz más grande, la más pequeña se destruye y así sucesivamente. Un desarrollador puede dar una pista para .NET para crear una matriz interna lo suficientemente grande antes de llenar laList
vía constructor:new List<T>(expected_array_size)
.utilizar
List<T>
. Internamente, utiliza matrices y las matrices utilizan memoria contigua.fuente
private T[] _items;
que se usa para el almacenamiento de backend, tipo de referencia o no.En primer lugar, manténgase alejado de
Arraylist
oHashtable
. Esas clases deben considerarse obsoletas en favor de los genéricos. Todavía están en el idioma para propósitos heredados.Ahora, lo que buscas es la
List<T>
clase. Tenga en cuenta que si T es un tipo de valor, tendrá memoria contiguos, pero no si T es un tipo de referencia, por razones obvias.fuente
C # tiene muchos tipos de referencia. Incluso si un contenedor almacena las referencias de forma contigua, los objetos mismos pueden estar dispersos por el montón
fuente
Parece que CLR / C # pronto tendrá un mejor soporte para Vector <>.
http://blogs.msdn.com/b/dotnet/archive/2014/04/07/the-jit-finally-proposed-jit-and-simd-are-getting-married.aspx
fuente