使用哪个STL容器?

时间:2012-05-12 19:40:34

标签: c++ stl containers

我应该使用哪个STL容器:

  1. 定期插入和删除数据。
  2. 随机定期访问数据。
  3. 例如:数据集(4,10,15)如果我想找到最接近9的数字,那么它应该给我10个。

    1. 我只存储一个整数。
    2. 需要排序
    3. 可以转到100k数据集
    4. 我想过使用矢量,但矢量插入和移除是很昂贵的。

         vector<int>
      

      如果我要使用list,我必须在到达数据之前访问O(n)元素。

         list<int>
      

      我正在考虑使用set,因为如果它已经排序会很好,但是我不太确定使用SET的效率

      所以我希望有人能给出一个好的解决方案!

5 个答案:

答案 0 :(得分:15)

我认为你应该检查这个SO帖子:In which scenario do I use a particular STL container?对于小尺寸矢量将适合大多数场景,无论你打算做什么。

图表是一个指南,但是定期访问容器的事实并不影响容器选择,你存储int的事实并不重要,除非你关心容器的大小,在这种情况下,开销是列表容器或地图中的指针对你很重要吗?

排序是通过地图自动完成的,但如果容器大小足够小以适应内存,则可以非常快速地对矢量和列表进行排序。

数据插入针对容器中任何位置的列表和映射进行了优化,对于地图,您可以获得它将自行排序的好处,但如果大小足够小,那么使用新条目构建新向量可能会非常快。

您可能还需要考虑哈希映射,您仍然最好对自己的代码进行分析,然后根据您的使用情况来猜测最佳选择,并且您确实需要进行衡量和分析。

您还可以确定STL <map>是一个足够好的余额或<set>并使用这些容器,因为它们会自动排序插入和删除,并且查找速度很快但是有开销保持每个条目中的指针增加与vector相比使用的内存大小,如果你不关心这个,那么你可以考虑这些容器。

如果重要的是测试和配置文件并比较每个容器的性能,您会惊讶于代码将如何与您的假设相比。

答案 1 :(得分:7)

如果要求只是表现,那么选择基本上应该是std::vector

它避免了基于节点的数据结构(树和列表)的大量内存分配,并且它利用空间局部性来实现更有效的遍历。

当然,向量中间的插入/移除需要移动元素,但即便这样也很少使向量比其他数据结构慢。

我看到使用其他数据结构的唯一真正原因是:

  • std::map / std::set:这些都非常方便。好用且易于使用,因此如果不需要最佳性能,我会在需要排序容器或键/值映射时使用它们。 (为了获得最佳性能,排序的矢量可能是更好的选择)
  • 所有其他容器:对于正确性可能有用,可以保证面对修改时的提议:向量经常重新分配并移动其内容,这会使指针和迭代器无效进入向量。其他数据结构提供了更强的保证(对于deque,指针保证在插入/删除结束后保持有效,但迭代器可能仍然无效。对于list,{{1} }和set,指针和迭代器都保证在插入/删除期间保持有效)

当然,这些只是经验法则。

涉及表现时唯一普遍适用的规则是“自己做基准”。我可以告诉你map在许多常见场景中通常如何执行,但我不能告诉你它是如何在你的代码中执行的,使用你的编译器和您的标准库。因此,如果您担心性能,请进行测量。尝试不同的替代方案,看看哪个更快。

答案 2 :(得分:2)

一个集合足以插入/删除/访问,并且始终排序。唯一要考虑的是集合中的条目是const(所以排序没有被破坏),所以要更改,你应该删除,更新和插入

答案 3 :(得分:1)

您的问题的答案完全取决于您的数据集大小,随着列表增长到巨大的大小,执行线性遍历到达您需要删除/插入的元素所花费的时间超过了向量进行删除/插入所需的时间。 因此,如果您的数据集较小,请使用列表,如果它很大,请使用矢量。

答案 4 :(得分:1)

如果需要排序,请使用二进制搜索树