链接列表与矢量

时间:2017-11-09 23:44:47

标签: c++ list vector

有关链接列表与载体的问题与效率有关。

我理解链接列表插入/删除是常量时间,而与向量相同的操作是线性的。但是,考虑到您必须在链表上执行线性搜索才能插入/删除,这不会成为线性操作。

插入/删除操作本身是不变的,但由于无法插入/删除w / o遍历链表,因此最终会进行线性操作。 search + insert / delete = linear。

所以我不明白这是一个优于矢量的优势。对我来说,它是一样的。两者(最终)都需要线性操作才能插入/删除。

我在这里缺少什么?

2 个答案:

答案 0 :(得分:1)

插入:当我们在向量中插入时(假设不在末尾),我们需要在插入位置O(n)之后对所有元素进行混洗,而在链表中我们只需将前一个节点指向新节点并将新节点指向旧的下一个节点O(1)。

到达:在达到向量中的插入位置时,我们只需要转到索引O(1),而在链表中,当我们从开始到位置时,它需要O(n)。

因此,两者都有利弊,这取决于应用。

如果在随机位置有很多插入,一次又一次地重新排列元素将是低效的,并且链表是更好的解决方案。在处理向量/链表中的复杂对象时,这一点会合并。

如果插入操作很少次,并且在固定位置也是如此(特别是在系列的末尾),矢量将是更好的选择。

答案 1 :(得分:0)

通常,容器的复杂程度取决于操作。这些东西有很多资源。我发现this one足够清楚了。

还需要考虑的另一件事是内存分配方式。

向量连续存储数据,防止缓存未命中,这可以大大加快应用程序的速度。这样做的缺点是指向存储在向量中的数据的指针,这些数据在执行常见操作时会失效。有一些解决方法,比如在初始化期间保留内存,但问题出在那里。

另一方面,链接列表的内存分散。可能存在大量缓存未命中,但指针通过插入和删除是有效的。

研究每个容器并选择最适合您需求的容器!