2010-10-10 27 views
7

Je pensais que les tableaux dynamiques remplaçaient les vecteurs dans D, mais il semble qu'ils n'aient pas de fonction de suppression (uniquement les tableaux associatifs), ce qui est plutôt une limitation pour un vecteur, donc je me demande si j'ai bien compris. Si un ont un tableau comme suit,Vecteurs et tableaux dynamiques en D

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

la seule façon dont je l'ai trouvé pour enlever, par exemple, le deuxième élément est,

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

Mais cela ne semble pas juste (mais peut-être seulement parce que je ne comprends pas encore tout cela). Y a-t-il donc un vecteur et existe-t-il un autre moyen de supprimer un élément d'un tableau dynamique?

Merci.

Répondre

6

Vous pouvez utiliser std.algorithm.remove(), qui fonctionne non seulement avec des tableaux mais avec des plages génériques. Exemple:

import std.algorithm; 

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

Il est vrai que tableau serait probablement mieux si ce que vous cherchez vraiment est un vecteur, puisque RAID ne pas redimensionner son tableau interne à chaque fois que vous ajoutez ou supprimez quoi que ce soit à/de il. –

+0

@Jonathan: Savez-vous si c'est une exigence de la spécification de la langue, ou est-ce que la mise en œuvre est définie? C'est-à-dire qu'un compilateur peut-il implémenter le tableau intégré comme 'std.container.Array'? –

+0

Je ne connais pas les exigences exactes. Le compilateur a une certaine marge de manœuvre, mais je doute beaucoup que ce soit le cas (et je ne pense pas qu'il le devrait) allouer le double de la mémoire dont il a besoin dans le cas général. Les tableaux possèdent une propriété de capacité qui vous indique le nombre d'éléments que vous pouvez ajouter avant de devoir être réaffectés, et si vous jouez avec, vous pouvez voir qu'il y a définitivement de la mémoire supplémentaire, mais il est probable que un peu de mémoire si elle essayait de garder autant de mémoire que Array. http://www.digitalmars.com/d/2.0/arrays.html –

3

Dans std.container, il existe un modèle Array!T, qui ressemble beaucoup à std::vector de C++.

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

Malheureusement, il ne semble pas avoir une méthode individuelle de supprimer, même si vous pouvez toujours utiliser linearRemove avec une gamme singleton.