对于一个简单的链表,其中不需要随机访问列表元素,是否有任何显着的优势(性能或其他)使用std::list
而不是std::vector
?如果需要向后遍历,那么在迭代其元素之前使用std::slist
和reverse()
列表会更有效吗?
像往常一样,性能问题的最佳答案是为您的用例分析两种实现,并查看哪种更快.
一般情况下,如果你有插入到数据结构中(除了最后),那么vector
可能会更慢,否则在大多数情况下vector
预期比list
仅仅针对数据局部性问题表现更好,这意味着如果两个元素相邻数据集在内存中相邻,然后下一个元素已经在处理器的缓存中,并且不必将内存页面故障放入缓存中.
还要记住,a的空间开销vector
是常量(3个指针),而a的空间开销list
是为每个元素支付的,这也减少了任何一个可以驻留在缓存中的完整元素(数据加上开销)的数量时间.
在C++中要考虑的默认数据结构是Vector.
考虑以下几点......
1]遍历:
列表节点分散在内存中,因此列表遍历会导致缓存未命中.但矢量的遍历是平滑的.
2]插入和删除:
当您对Vector执行此操作时,必须移动平均50%的元素,但缓存非常擅长!但是,对于列表,您需要遍历插入/删除点......所以再次......缓存未命中!令人惊讶的是,矢量也赢得了这个案例!
3]存储:
当你使用列表时,每个元素有2个指针(向前和向后),所以List比Vector大得多!向量只需要比实际元素需要更多的内存.
Yout应该有理由不使用矢量.
根本没有.列表优于Vector,但顺序访问不是其中之一 - 如果这就是你所做的一切,那么矢量就更好了.
然而,添加额外元素而不是列表的向量更昂贵,特别是如果您插入中间.
了解这些集合是如何实现的:向量是一个连续的数据数组,列表是一个包含数据和指向下一个元素的指针的元素.一旦你理解了这一点,你就会明白为什么列表对插入有好处,对随机访问有害.
(因此,向量的反向迭代与正向迭代完全相同 - 迭代器每次只减去数据项的大小,列表仍然必须通过指针跳转到下一个项目)