2010-10-10 16 views
7

Estaba pensando que las matrices dinámicas eran un reemplazo para vectores en D, pero parece que no tienen función de eliminación (solo arreglos asociativos) que es más bien una limitación para un vector, así que me pregunto si tengo eso correcto. Si una tiene una matriz como la siguiente,Vectores y matrices dinámicas en D

uint[] a; 
a.length = 3; 
a[0] = 1; 
a[1] = 2; 
a[2] = 3; 

Entonces la única manera que he encontrado para eliminar, por ejemplo, el segundo elemento es,

a = a[0..1] ~ a[2]; 

Pero eso no parece correcto (pero tal vez solo porque todavía no entiendo todo esto). Entonces, ¿hay un vector y hay otra forma de eliminar un elemento de una matriz dinámica?

Gracias.

Respuesta

6

Puede usar std.algorithm.remove(), que funciona no solo con matrices sino también con rangos genéricos. Ejemplo:

import std.algorithm; 

void main() { 
    uint[] a = [1, 2, 3]; 
    a = a.remove(1); 
    assert(a == [1, 3]); 
} 
+1

cierto, sin embargo matriz probablemente sería mejor si lo que realmente estás buscando es un vector, ya que la matriz no tiene que cambiar el tamaño de la matriz interna cada vez que agregue o quite nada a/de eso. –

+0

@Jonathan: ¿Sabes si ese es un requisito de la especificación del idioma o se define su implementación? Es decir, ¿podría un compilador implementar la matriz incorporada como 'std.container.Array'? –

+0

No sé cuáles son los requisitos exactos. El compilador tiene cierto margen de maniobra, pero dudo mucho de que (y no creo que así sea) asigne el doble de la memoria que necesita en el caso general. Las matrices tienen una propiedad de capacidad que te dice cuántos elementos puedes agregar antes de que tenga que ser reasignada, y si juegas con ella, puedes ver que definitivamente mantiene algo de memoria extra allí, pero podría decirse que un poco de memoria si trata de mantener tanta memoria extra como Array. http://www.digitalmars.com/d/2.0/arrays.html –

3

En std.container hay una plantilla Array!T, que parece ser muy similar a std::vector de C++.

Array!int a = [0, 1, 2, 3]; 
a.linearRemove(a[1..3]); 
assert(equal(a, [0, 3])); 

Por desgracia, no parecen tener un método remove individual, aunque siempre se puede utilizar con una amplia gama linearRemove Singleton.

Cuestiones relacionadas