我应该使用哪个STL容器? C ++

时间:2012-12-05 10:50:54

标签: c++ stl vector containers deque

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

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

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:7)

我们可以为您提供指导,但没有明确的答案 - 您需要自己进行基准测试,因为它至关重要取决于您的收藏和对象大小:

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

但是,我不能说这两种情况之间的切断点究竟在哪里。

此外,如果您可以使用交换元素而不是插入,这是一个明智的选择:始终使用std::list

答案 1 :(得分:2)

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

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

所以:如果在没有迭代列表的情况下知道位置,那么去一个向量。 如果位置需要迭代集合,那么去列表。