列表允许推送,弹出和放大切换值

时间:2014-02-10 20:11:55

标签: list caching d

D中有没有办法让你有一个允许你转移的清单 价值观?我正在创建一个缓存,我想保留一个 上次访问项目时的日志,以便缓存收缩时 或者即将溢出我可以删除尚未存在的项目 暂时访问。

我希望能够向后推并弹出 面前。请注意我想从前面弹出,而不是 从后面看,因为我希望弹出最旧的物品。

我希望能够搜索该项目是否真的在 名单。如果不存在这样的功能,我可以选择 自己实施;这并不重要。

我希望能够切换物品。这让我 当访问列表中已有的项目时,我可以将其放回去 在后面,最近的项目所在的位置。

D中是否已存在此类功能,是否有更好的功能 这样做的方法?

3 个答案:

答案 0 :(得分:2)

不,我知道没有这样的D包。理想情况下,它应该像JCache一样,但我担心这样做太多了。 :) JCache将成为已经很出色的Java API的一个惊人的补充。

D社区肯定会受益于类似的东西。

答案 1 :(得分:2)

我建议你使用SList(单链表)或双链表作为缓存包装的基础。

访问该条目时,您将其从链接列表中删除并将其添加到开头。 该解决方案不需要太多的计算开销。

答案 2 :(得分:2)

我发现许多具有CS背景的人都有一个共同的错误信念,即必须对他们认为“非平凡”的用例使用聪明的数据结构。我相信这来自于通常用于渐近操作复杂性讲座的所有时间。

事实上,95%的时间(或更多)数组是您必须使用的数据结构。虽然从数学纯粹主义的角度来看很难相信,但实际上却是如此。

考虑Bjarne Stroustroup http://bulldozer00.com/2012/02/09/vectors-and-lists/

之一的一个例子

简而言之,他提供了任何CS学生告诉你的任务的测量结果,只是为了链表数据结构,矢量是你应该考虑的最后一件事。在实践中,结果恰恰相反 - 基于矢量的实现远远超过了基于列表的实现(并且有充分的理由)。

另一个权威人士,亚历山大斯捷潘诺夫(C ++的STL的设计者和第一个实施者)教他的课程相同。为了松散地引用他,他告诉学生们:“当你需要一个容器时,总是使用矢量。那里有大量的数据结构,但那些不适合你。你 - 你总是使用矢量。”

显然,他夸大了,但重点是明确的 - 到目前为止,大多数情况下,首选的数据结构是矢量。

回到这个问题。你说的那一刻“我希望能够搜索该项目是否真的在列表中。”你应该用阵列来解决。如果在某些时候你会怀疑这个选择是一个真正的瓶颈,你应该非常仔细地测量它并使用其他东西确保它确实更快地工作(通常,它不会那么微不足道)。

从实现方面来说,D有popFront方法,它与数组一起工作并与〜运算符连接。您可以使用随机访问,交换元素,使用canFind以及std.algorithm与数组的几乎所有内容。此外,数组具有length属性,因此您可以处理其增长。

值得注意的是,这种方法隐含地附带了一个看似浪费的内存分配策略。但实际上,这是一个很好的默认值,你应该在切换到别的东西之前真正衡量你担心的指标(性能和/或内存占用量)。