C++面试题(14)| vector和list的遍历效率哪个更好?

389 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第7天,点击查看活动详情

image.png

(欢迎大家关注我的微信公众号——控制工程研习,上面会分享很多我学习过程中总结的笔记。)

1. vector和list的区别

1)vector底层实现是数组;list是双向链表。

2)vector支持随机访问,list不支持。

3)vector拥有的是一段连续的内存空间,而list不是。

4)vector在中间节点进行插入删除会导致内存拷贝,list不会。

5)vector一次性分配好内存,不够时才进行2倍扩容;list每次插入新节点都会进行内存申请。

6)vector随机访问性能好,插入删除性能差;list随机访问性能差,插入删除性能好。

2. 如果都是遍历一个vector或者遍历一个list,那么用哪个更好?

    遍历vector(如读取它的所有元素)比遍历list更快,主要原因就是vector的存储空间是连续的,而list不是。具体原因可能有下面几种:

(1)迭代对于CPU的机器指令操作不同。

    vector迭代器(连续内存):当您增加vector迭代器时,迭代器值简单地添加对象的大小(在编译时已知)以指向下一个对象。在大多数 CPU 中,这最多是一到三个指令。

    而list迭代器当你增加一个list迭代器(指向的对象)时,前向链接的位置通过添加一些数字来定位指向对象的基址,然后作为迭代器的新值加载。这样就要进行一次以上的内存访问,并且比vectors迭代操作慢。

(2)内存访问更快。

    如今,由于处理器在重新映射主存储器整个页的cache(读取速度比RAM 快1000倍)上运行,如果元素是连续的,则它们很可能适合相同的内存页,因此是迭代开始时在cache中一起移动。在继续进行时,一切都发生在cache中,无需进一步移动数据或进一步访问较慢的 RAM。

    而如果使用 list,由于其中元素在内存中的分布都是稀疏(sparse)的,所以读取下一个元素意味着引用一个地址,它可能不在其前一个内存页中,因此,cache需要在每次迭代中更新,访问更慢的 RAM 。

参考网站:

[1] stackoverflow.com/questions/1…