【问题标题】:Which STL container should I use? C++我应该使用哪个 STL 容器? C++
【发布时间】:2012-11-23 04:16:10
【问题描述】:

我有一个对象“列表”,我想从中随机取出对象并将其推到此列表的前面。只会执行这种操作。所以我不需要快速访问列表末尾,只需要它的前面和对任何其他地方的平均访问。

哪个容器最适合这个?我在考虑std::vector,但我读到insert 操作效率不高。然后我想出了std::deque,因为它可以快速访问前面,但是erase在特定位置方法的效率如何?

提前感谢您的帮助。

【问题讨论】:

  • 您的容器中将存储多少数据? 1MB以下,选择简单的vector。不会有很大的性能差异。
  • 如果对象很大,那么优化的第一个尝试可能是使用指向它们的(智能)指针的向量/双端队列。您的erase 仍然是O(n),但要移动的数据量更小。
  • 如果您要使用vector,请将其推到后面并使用反向迭代器。把它推到前面是愚蠢的。
  • 你需要push它在列表的顶部,还是swap这个元素在顶部?后者效率更高
  • @Mosquito,那就用矢量(更好的指针)

标签: c++ stl vector containers deque


【解决方案1】:

我们可以为您提供指导,但没有明确的答案——您需要自己进行基准测试,因为这在很大程度上取决于您的收藏和对象大小:

  • 对于小对象和/或相对较小的集合,std::vector 会更快,因为即使您需要复制更多数据,随机访问时间也更好(O(1) vs O(n) std::list)并且缓存位置将占主导地位。
  • 对于大型对象和/或大型集合,std::list 会更快,因为虽然您需要 O(n) 来选择随机对象,但插入会更快,因为复制许多大型对象非常慢。

但是我不能说这两种情况之间的确切界限在哪里。

此外,如果您可以交换元素而不是插入,这很容易:始终使用std::vector。

【讨论】:

  • 感谢您的回答,康拉德。 :-)
【解决方案2】:

基于此答案:https://stackoverflow.com/a/471481/1284631(以及此答案:https://stackoverflow.com/a/471461/1284631),我会列出一份清单。追加、迭代、插入和删除都很便宜。

PS:这取决于随机位置是否基于索引(也就是说,如果你知道 numerically 什么位置,或者要移动到前面的对象通过迭代列表和测试其属性)。

所以:如果在不迭代列表的情况下知道位置,那么就选择一个向量。 如果该位置需要遍历集合,则选择一个列表。

【讨论】:

  • 即使在第二种情况下,由于缓存局部性,std::vector 在许多情况下也会更快。
  • @KonradRudolph:你是对的,因为它还取决于数据结构的大小。向量的真正问题是当元素被移动(即从其当前位置删除)时的不良行为,这将触发向量洗牌。如果 OP 可以绕过该操作,则向量是首选的选择。 OTOH,对于小型数据结构,它可以简单地使用两个向量:一个带有感兴趣的值,另一个带有表示这些值的当前顺序的排列。 “删除和插入”过程只是第二个 vec 的值变化。
猜你喜欢
  • 2018-12-03
  • 2010-11-18
  • 1970-01-01
  • 2012-03-04
  • 1970-01-01
  • 2010-12-06
  • 2012-05-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多