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



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

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

提前感谢您的帮助。

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

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

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

此外,如果您可以交换元素而不是插入,这是不费吹灰之力的:始终使用 std::vector .

基于这个答案:https://stackoverflow.com/a/471481/1284631(还有这个:https://stackoverflow.com/a/471461/1284631),我会去列出一个列表。附加、迭代、插入和删除很便宜。

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

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

最新更新