数组列表与列表

时间:2015-05-22 09:18:33

标签: c++ arrays list

list使用了大量内存,因为它添加了一个指向每个节点的指针,它不是连续的,内存是碎片化的......我认为List of arrays好多了。例如,如果我管理100个对象,则list的{​​{1}}的20比100的5 array好很多,只有5个指针加上100个指针,我们赢得了地点,使用相同的List时,我们的碎片更少。 我对此做了一些研究,但我找不到任何有趣的文章,所以我觉得我错过了一些东西。

array上使用List有什么好处?

编辑:这是定义不是数组与列表...更像是为什么每个列表只放置一个元素节点如果可以放更多

2 个答案:

答案 0 :(得分:2)

我认为这是一个有效的问题,因为内存位置可能会影响程序的性能。您可以按照某些建议尝试std::deque。但是,典型实现使用内存块的声明是关于实现的一般声明,而不是标准。因此不能保证如此。

在C ++中,您可以通过自定义分配器和内存池来改善数据的位置。每个STL容器都作为参数分配器。默认分配器可能是newdelete的简单包装器,但您可以提供自己的使用内存池的分配器。您可以找到有关分配器here的更多信息,here是指向C ++默认分配器的链接。 Here是关于此主题的dr.dobbs文章。引文来自文章:

  

如果您正在使用基于节点的容器(例如地图,集合或列表),则针对较小对象优化的分配器可能是更好的方法。

只有剖析才会告诉您哪种情况最适合您的情况。也许std::deque和自定义分配器的组合将是最佳选择。

答案 1 :(得分:1)

某些操作保证了std::list的常数时间复杂度,而不是std::vectorstd::deque。例如,使用std::list,您可以将具有一百万个项目的列表中间的5000个连续元素的子序列("拼接")移动到开头(仅限同一列表!)中恒定时间。无论使用std::vector还是std::deque都无法做到这一点,即使对于数组列表,它也会更加复杂。

这是一本很好的读物:Complexity of std::list::splice and other list containers