c++ - 当元素是指针或引用时,连续内存 vector 没有优势吗?

标签 c++ list caching vector containers

我一直在阅读有关 C++ 标准库中不同容器的信息,而且我一直听说在实践中,简单 vector 在遍历元素时通常如何优于大多数其他容器。据说这是由于缓存一致性(所有存储在连续内存中),而不是在二叉树或链表中从一个地方跳到另一个地方。但我在想,如果我们谈论的是指针 vector 或对对象的引用而不是对象本身,那么迭代 vector 将涉及在每次迭代时取消引用,其中对象位于单独的内存区域。在这种情况下,我看不出它比在列表或树中从一个链接跳到另一个链接更好。我看到它的方式如下所示,据我所知,每个人都做同样的事情。

enter image description here

如果这是真的,那么我是否可以假设每当人们声称 vector 对缓存更友好时,只有在存储对象时才是这种情况,而不是对象的指针或引用?另外,我不认为指向多态类型的指针是否会在两者之间产生差异?

最佳答案

|ptr1|ptr2|ptr3|ptr4|       //vector

|ptr1|--->|ptr2|--->|ptr3|--->|ptr4|   //list

现在考虑通过 ptr3 访问第三个对象。

vector 花费的时间。

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)

关于c++ - 当元素是指针或引用时,连续内存 vector 没有优势吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45800070/

相关文章:

Python: "If"函数

Java大量事务对象缓存

c++ - 字符串流输出比较

c++ - 在 Mac OSX 中使用 cv::VideoWriter 会产生 "WARNING: Could not create empty movie file container."

c# - 是否应该将此列表初始值设定项行为报告为 Visual Studio C# 编译器中的错误?

python - 根据值将字典转换为具有长度的列表

caching - Varnish 在请求中混合用户代理

ios - Objective-c 清除缓存 NSCachedURLResponse

c++ - 我的 Visual C++ 编译器编译了过时的源

c++ - 如何打印调试 C++ Win32 DLL?