我一直在阅读C ++标准库中的不同容器,并且我一直在听到在迭代元素时,实际中简单向量如何经常优于大多数其他容器。据说这是由于缓存一致性(全部存储在连续的内存中),而不是在二叉树或链表中从一个地方跳到另一个地方。但我在想,如果我们正在讨论指针或对象引用的向量而不是对象本身,迭代向量将涉及对每次迭代的取消引用,其中对象位于单独的区域中记忆。在这种情况下,我无法看到它比从列表或树中的链接跳转更好。我看到它的方式就像下面这样,而且就我所见,每个人几乎都做同样的事情。
如果这是真的,那么我可以假设每当人们声称向量对缓存更友好时它只是存储对象的情况,而不是指针或对象的引用吗?另外,我不认为如果指针是多态的类型会对两者产生影响吗?
答案 0 :(得分:1)
|ptr1|ptr2|ptr3|ptr4| //vector
和
|ptr1|--->|ptr2|--->|ptr3|--->|ptr4| //list
现在考虑通过ptr3
访问第三个对象。
矢量所用的时间。
O(1) time to reach ptr3 + time to dereference ptr3
列表所花费的时间
O(2) time to reach ptr3 + time to dereference ptr3.
所以区别在于达到要解除引用的指针。
一般来说,访问vector
上的元素是O(1),而list
中的元素是O(n)