2010-10-10 35 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用单范围。