D语言中的向量和动态数组

7

我认为动态数组在D语言中是向量的替代品,但似乎它们没有删除函数(只有关联数组有),这对于向量来说是相当有限制的,因此我想知道我是否理解正确。如果我有一个如下所示的数组,

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

我发现唯一的删除第二个元素的方法是:

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

但这似乎不太对(也许只是因为我还不理解所有的内容)。那么是否有向量,是否有另一种从动态数组中删除元素的方法呢?

谢谢。

2个回答

6
您可以使用std.algorithm.remove(),它不仅适用于数组,还适用于通用范围。 例如:
import std.algorithm;

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

1
如果你真正想要的是一个向量,那么使用Array可能会更好,因为每次添加或删除元素时,Array不需要调整其内部数组的大小。但是True也可以使用。 - Jonathan M Davis
@Jonathan: 你知道这是否是语言规范的要求,还是实现定义?即,编译器是否可以像std.container.Array一样实现内置数组? - Peter Alexander
我不知道确切的要求是什么。编译器有一些余地,但我非常怀疑它会(也不认为应该)在一般情况下分配双倍于所需内存。数组确实有一个容量属性,告诉您在必须重新分配之前可以向其附加多少元素,如果您玩弄它,可以看到它肯定会保留一些额外的内存,但如果它试图保留与Array一样多的额外内存,则可能会成为一个内存猪。http://www.digitalmars.com/d/2.0/arrays.html - Jonathan M Davis
不需要分配双倍内存。例如,std::vector 通常只分配多达50%的内存(因此平均为25%),这并不太奢侈。我更喜欢它每隔一段时间分配更多的内存,而不是在每次连接时都进行分配。 - Peter Alexander

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]));

很不幸,它似乎没有单独的删除方法,但是您可以始终使用具有单例范围的linearRemove


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接