为什么D语言缺少容器类?

17

我习惯于使用C++的STL容器。D语言中有数组、关联数组和字符串,但是其他的呢?我知道std.container,但据我所知,它只有一个容器,即红黑树,如果我需要类似于std::set的东西,我可以使用它。但是,如果我需要一个list呢?难道我应该使用数组吗?

std::vector数组(array)

std::deque

std::queue

std::stack?也许是数组和std.container函数?

std::priority_queue二叉堆(BinaryHeap)

std::list

std::setstd.container红黑树(RedBlackTree)

std::multiset

std::unordered_set

std::map关联数组(associative arrays)

std::multimap

std::unordered_map

有计划支持其中任何一个吗?


std.container 包含一个单向链表 (SList)。 - Vladimir Panteleev
对于multimaps,您可以只使用数组的关联数组。对于无序集,您可以使用带有虚拟值类型(boolvoid [0])的关联数组。请注意,关联数组是无序的。 - Vladimir Panteleev
双端队列、队列和栈可以使用数组和切片/连接运算符进行简单(但效率低下)的模拟。 - Vladimir Panteleev
2个回答

20

我认为std.container缺乏更多容器的主要原因是Andrei Alexandrescu一直在解决如何处理自定义分配器的最佳方式,他希望在实现所有杂项容器类型之前先解决这个问题,否则一旦他这样做就需要进行大量的代码更改。

在此期间,您可以使用内置数组和关联数组,std.container包含Array(本质上是std::vector)、SList(单链表)、RedBlackTree(可用于任何类型的集合或映射,使用树结构 - 这是STL的各种set和map类型所做的),以及BinaryHeap

因此,毫无疑问,情况需要得到改善(也将得到改善),但我不知道会有多快。最终,std.container应该具有与所有STL容器类型相对应的容器类型。


4
分配器应该是Phobos审核队列中的下一件重要事情之一,主要是因为Andrei已经提出了一个设计,我已经将其用于RegionAllocator,并且还实现了一个简单的包装器来证明该设计适用于多个分配方案的GC分配器。 - dsimcha
1
作为临时解决方案,考虑使用dcollections怎么样? - Alexander Malakhov
2
如果你想使用它,dcollections可以很好地工作,但显然它不是标准库的一部分。然而,它是一个可靠的库。 - Jonathan M Davis
@dsimcha 一年过去了,还是没有分配器! - Arlen
@Arlen 他提到的审查引起了很多讨论,并且关于如何处理自定义分配器的计划也发生了变化。Andrei Alexandrescu一直在研究新的设计,但他也非常忙碌,所以还没有最终确定。它最终会发生(希望是早一点),但肯定比我们想象中要慢。当最繁忙的贡献者成为瓶颈时就会发生这种情况。但这是我们非常想正确处理的事情,因此虽然缓慢令人恼火,但与被困在错误的设计中相比,这更好。 - Jonathan M Davis
显示剩余2条评论

10

容器在D语言的库开发中还未完全实现,因为没有人能够达成关于设计应该是什么的一致意见,而且每个为标准库做出贡献的人(标准库正在迅速增长)都找到了更有趣的事情来做。

std::vector -> array 如你所说

std::dequeue, std::queue: 不幸的是,我们还没有这个功能。

std::stack: 可以轻松地在SList或数组之上实现。

std::set: 可以在RedBlackTree之上轻松实现。

std::multiset: 我认为RedBlackTree可以设置为允许重复项。

std::unordered_set: 可以轻松地在内置的关联数组之上实现。要在内置的关联数组之上实现它,请使用byte[0][SomeType]

std::map: 可以在RedBlackTree之上轻松实现。

std::multimap: 可以使用数组的关联数组来实现。

std__unordered_map: 使用内置的关联数组即可。


std::dequeuestd::queue --> std.container.Array - DejanLekic

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