2010-10-10 68 views
7

我在想動態數組是D中的向量的替代品,但它似乎沒有刪除函數(只有關聯數組),這是一個矢量的限制,所以我想知道如果我有這個權利。如果有一個數組一樣如下,D中的向量和動態數組

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

然後我發現的唯一方法刪除,也就是說,第二個因素是,

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

但是,這似乎並沒有權利(但也許只是因爲我現在還不明白這一點)。那麼有沒有一個矢量,並有另一種從動態數組中刪除元素的方法?

謝謝。

回答

6

您可以使用std.algorithm.remove(),它不僅適用於數組,而且適用於通用範圍。例如:

import std.algorithm; 

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

真實,雖然陣很可能是,如果你真正尋找的是一個矢量更好,因爲數組沒有每次添加的時間來調整其內部數組或刪除任何東西到/它。 – 2010-10-11 07:09:56

+0

@Jonathan:你知道這是否是語言規範的要求,還是它的實現定義?即編譯器是否可以像'std.container.Array'一樣實現內置數組? – 2010-10-11 07:38:52

+0

我不知道具體要求是什麼。編譯器有一些餘地,但我非常懷疑它會(並且我認爲它不應該)在一般情況下分配它需要的內存的兩倍。數組確實有一個容量屬性,告訴你可以在需要重新分配之前添加多少個元素,如果你玩弄它,你會發現它確實在那裏保留了一些額外的內存,但它可以被證明是如果它試圖保持像Array那樣多的額外內存,那麼它會佔用內存。 http://www.digitalmars.com/d/2.0/arrays.html – 2010-10-11 16:52:53

3

std.container中有一個Array!T模板,它看起來很像C++的std::vector

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

遺憾的是它並沒有出現有個別remove方法,雖然你總是可以使用linearRemove用單範圍。