我一直在花很多时间来回顾我是否应该使用向量或链表。我一直在阅读关于这个主题的许多完全矛盾的观点,所以我想在 REAL 世界中基于 TODAY'S 硬件得到一个坚定的答案。
所以我被告知,如果你在序列的中间进行大量的插入和删除,链接列表将是理想的,复杂度为O(1)
(这本身就是我不喜欢的)完全理解,因为你必须一直遍历到所需的位置),而插入矢量显然非常慢,复杂度为O(n)
另一方面,在观看 Bjarne Stroustrup https://www.youtube.com/watch?v=YQs6IC-vgmo的演讲之后,似乎没有真正使用链接列表,并使用链接列表,因为会有很多插入和删除实际上只能由天真的学生实施。我从中获得的是,基本上通过链表的遍历的性质,它在通过内存中的不同位置时执行多次随机访问,而向量执行一次随机访问,直接将您发送到所需位置。这个解释准确吗?
在我的实现中,序列是维护顺序,每帧更新每个元素的新值,因此,删除和插入很多。
我的问题是: 是否有任何链接列表的用途?即使是为了维持秩序而不仅仅是通过海峡进行直播?
背景信息:
答案 0 :(得分:3)
我不会对你的具体情况发表评论,但是,有很多例子在"真实"世界,今天"今天"硬件,使用链表是有意义的。
一个示例:malloc
和free
(即动态内存分配器)的实现通常使用链接列表跟踪可用内存块。在每个内存块中包含一些额外的字节用于链表指针。这样,空闲块本身可以链接在一起,而无需在别处分配任何额外的内存来跟踪它们(如矢量所需)。
这意味着分配器只需要常量内存量来进行内部记录。否则,您的动态分配器本身需要使用动态分配器来增加其空闲列表(实际上是#34;自由向量")。
Linux内核(可能还有其他操作系统内核)使用链接列表来处理很多事情。我想如果它使用了向量,那么当它必须增长向量时会导致不希望的延迟峰值(如果它在发生时发生了一些重要的锁定,或者在屏蔽中断等情况下会非常糟糕)。