要使用的 STL 容器

Which STL Container to use?

本文关键字:STL 容器      更新时间:2023-10-16

如果出现以下情况,我应该使用哪个 STL 容器:

  1. 定期插入和删除数据。
  2. 定期随机访问数据。

例如:dataset(4,10,15( 如果我想找到最接近 9 的数字,那么它应该返回我 10。

  1. 我只存储一个整数。
  2. 它需要排序
  3. 可以转到 100k 数据集

我想过使用矢量,但矢量插入和删除很昂贵。

   vector<int>

如果我要使用列表,我必须在访问数据之前访问 O(n( 元素。

   list<int>

我正在考虑使用 set,因为如果对其进行排序会很好,但我不太确定使用 SET 的效率

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

我认为您应该检查此SO帖子: 在哪种情况下使用特定的 STL 容器? 对于小尺寸,无论您打算做什么,矢量都将适合大多数场景。

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

排序由 map 自动完成,但如果容器大小足够小以适合内存,则对向量和列表进行排序可能会非常快。

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

您可能还需要考虑哈希映射,您仍然最好分析您的代码,尝试猜测什么是最佳的取决于您的使用情况,并且您确实需要测量和分析。

您也可以决定 STL <map>是一个足够好的平衡或<set>并使用这些容器,因为它们会自动对插入和删除进行排序,并且查找速度很快,但维护每个条目中的指针会产生开销,与矢量相比,这会增加所用内存的大小, 如果你不关心这个,那么你可以考虑这些容器。

尽管如此,如果它很重要,然后测试、分析和比较每个容器的性能,你会惊讶于代码将如何根据你的假设执行。

如果要求只是性能,那么选择基本上应该始终是一个std::vector

它避免了基于节点的数据结构(树和列表(的许多内存分配,并利用空间局部性进行更高效的遍历。

当然,在向量

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

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

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

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

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

一个集合足够高效,可以插入/删除/访问,并且它总是被排序的。 唯一要考虑的是集合中的条目是常量(因此顺序不会中断(,因此要进行更改,您应该删除,更新和插入

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

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