list
使用了大量内存,因为它添加了一个指向每个节点的指针,它不是连续的,内存是碎片化的......我认为List of arrays
好多了。例如,如果我管理100个对象,则list
的{{1}}的20比100的5 array
好很多,只有5个指针加上100个指针,我们赢得了地点,使用相同的List
时,我们的碎片更少。
我对此做了一些研究,但我找不到任何有趣的文章,所以我觉得我错过了一些东西。
在array
上使用List
有什么好处?
编辑:这是定义不是数组与列表...更像是为什么每个列表只放置一个元素节点如果可以放更多
答案 0 :(得分:2)
我认为这是一个有效的问题,因为内存位置可能会影响程序的性能。您可以按照某些建议尝试std::deque
。但是,典型实现使用内存块的声明是关于实现的一般声明,而不是标准。因此不能保证如此。
在C ++中,您可以通过自定义分配器和内存池来改善数据的位置。每个STL容器都作为参数分配器。默认分配器可能是new
和delete
的简单包装器,但您可以提供自己的使用内存池的分配器。您可以找到有关分配器here的更多信息,here是指向C ++默认分配器的链接。 Here是关于此主题的dr.dobbs文章。引文来自文章:
如果您正在使用基于节点的容器(例如地图,集合或列表),则针对较小对象优化的分配器可能是更好的方法。
只有剖析才会告诉您哪种情况最适合您的情况。也许std::deque
和自定义分配器的组合将是最佳选择。
答案 1 :(得分:1)
某些操作保证了std::list
的常数时间复杂度,而不是std::vector
或std::deque
。例如,使用std::list
,您可以将具有一百万个项目的列表中间的5000个连续元素的子序列("拼接")移动到开头(仅限同一列表!)中恒定时间。无论使用std::vector
还是std::deque
都无法做到这一点,即使对于数组列表,它也会更加复杂。
这是一本很好的读物:Complexity of std::list::splice and other list containers