Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 允许推送、弹出和显示的列表;开关量_List_Caching_D - Fatal编程技术网

List 允许推送、弹出和显示的列表;开关量

List 允许推送、弹出和显示的列表;开关量,list,caching,d,List,Caching,D,在D中有没有一种方法可以让你移动一个列表 围绕价值观?我正在创建缓存,我想保留一个 记录上次访问项目的时间,以便在缓存收缩时记录 或者即将溢出,我可以删除尚未删除的项目 一会儿就可以访问了 我希望能够推到后面,从后面弹出 前面。请注意,我想从前面弹出,而不是 从后面,因为我想把最旧的东西拿出来 我想能够搜索,如果该项目实际上是在 列表如果还没有这样的功能,我可以选择 亲自实施;这并不重要 我想能够切换项目周围。这让我 当访问列表中已有的项目时,我可以将其放回 在后面,最新的项目所在的位置 D中是

在D中有没有一种方法可以让你移动一个列表 围绕价值观?我正在创建缓存,我想保留一个 记录上次访问项目的时间,以便在缓存收缩时记录 或者即将溢出,我可以删除尚未删除的项目 一会儿就可以访问了

我希望能够推到后面,从后面弹出 前面。请注意,我想从前面弹出,而不是 从后面,因为我想把最旧的东西拿出来

我想能够搜索,如果该项目实际上是在 列表如果还没有这样的功能,我可以选择 亲自实施;这并不重要

我想能够切换项目周围。这让我 当访问列表中已有的项目时,我可以将其放回 在后面,最新的项目所在的位置

D中是否已经存在这样的特性,是否有更好的特性
做这件事的方法?

不,据我所知,没有这样的D包。理想情况下,它应该表现得像,但我恐怕这要求太多了。:)JCache将是对已经非常优秀的JavaAPI的一个惊人的补充


D社区肯定会从中受益。

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

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

< P>我发现许多CS背景的人有一个共同的错误信念,即必须使用一个聪明的数据结构来考虑他们认为“非平凡”的用例。我相信这来自于通常花费在讲授渐近运算复杂性上的所有时间

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

以比亚恩·斯特劳斯图(Bjarne Stroustroup)的一次会谈为例

简而言之,他为任何一个CS学生告诉你的任务提供了测量结果,这是为链表数据结构所做的,而矢量是你最不应该考虑的。在实践中,结果恰恰相反——基于向量的实现远远优于基于列表的实现(这是有充分理由的)

另一位权威人士亚历山大·斯捷潘诺夫(C++STL的设计者和第一个实现者)也教授同样的课程。粗略地引用他的话,这就是他告诉学生的:“当你需要一个容器时,总是使用向量。那里有无数的数据结构,但这些不适合你。你-你总是使用向量。”

显然,他言过其实了,但要点很清楚——到目前为止,大多数情况下,首选的数据结构是矢量

回到问题上来。当您说“我希望能够搜索该项是否确实在列表中”时,您应该使用数组解决。如果在以后的某个时候,你怀疑这个选择是一个真正的瓶颈,你应该非常仔细地测量它,并使用其他方法确保它工作得更快(通常,它不会那么琐碎)

从实现的角度来看,D有一个popFront方法,该方法使用数组并使用~operator进行连接。您可以使用随机访问、交换元素、使用canFind和几乎所有的东西,从std.algorithm到数组。此外,数组具有长度属性,因此可以处理其增长


在这种方法中需要注意的是,它隐含着一种内存分配策略,这可能看起来是浪费。但实际上,这是一个很好的默认值,在切换到其他方法之前,您应该真正衡量您担心的指标(性能和/或内存占用)。

我已经采用了基于链的方法;你认为你的方法会更快吗?老实说,我不知道,如果你需要速度,你也可以编写自己的链表实现(并在那之后对其进行基准测试),只有在值得开发/调试时间/成本的情况下才这样做,尽管一个链表比两个向量快。向量将要求我将访问时间和数据拆分为不同的向量,而列表只允许我开始查看列表的前面,然后转到列表后面不太可能被搜索的项目,因为它们已经有一段时间没有被使用了。据我所知,您可以使用单个向量来完成任务(使用popFront和连接),我不明白为什么需要2个向量。虽然您担心内存访问模式不一致,但您应该知道,原因列表通常很慢,这正是因为它设计使用随机内存访问模式。我正在考虑一种基于链的方法,这意味着经常被请求的项将获得更快的查找时间(因为他们在前面)我还不确定向量如何能打败这个……也许我们正在谈论不同的事情?我考虑一个情况,当你需要一个容器,有以下操作:弹出前元素,追加到结尾,元素交换和线性搜索。这是因为在这个列表中,线性搜索是最昂贵的操作,vector的性能比列表要好得多。因此,大多数情况下,它的总体性能优于列表。根据使用模式,这可能不是您的情况(例如,您几乎不使用线性搜索,而是执行大量弹出和附加操作),但事实上很有可能是这样。唯一确定的方法是测量。