在C ++中为给定方案选择List或Vector

时间:2013-11-05 14:01:38

标签: c++

对于我的应用程序,我正在使用STD向量。我在最后插入向量,但是从向量中随机删除,即元​​素可以从中间,前面的任何地方擦除。这两个只是要求,1)在最后插入2)从任何地方擦除。

因此,我应该使用STD List,因为擦除会导致数据移位。或者我会出于任何原因在我的代码中保留Vector?

请发表评论,如果Vector是更好的选择,那么在这里列出会更好吗?

5 个答案:

答案 0 :(得分:4)

使用std::vector超过std::list的一个关键原因是cache locality。在这方面列表很糟糕,因为它的元素可能(并且通常是)碎片化在你的记忆中。这将显着降低性能。

有些人会建议几乎总是使用std::vector。在性能方面,缓存局部性通常比插入或删除的复杂性更重要。

Here's a video about Bjarne Stroustrup's opinion regarding subject

答案 1 :(得分:2)

我会把你推荐给这个备忘单,结论就是清单。

enter image description here

答案 2 :(得分:1)

在这种情况下,列表最有可能更好。 list超过vector的优势在于它支持在任意位置删除并且具有恒定的复杂性。如果您需要对容器元素进行常量索引操作,那么vector只会是更好的选择。您仍然必须考虑要删除的元素如何传递给您的函数以进行删除。如果只传递索引,vector将能够在常量时间内找到该元素,而在列表中则必须进行迭代。在这种情况下,我会对这两个解决方案进行基准测试,但我仍然打赌列表表现更好。

答案 3 :(得分:1)

列表支持在常量时间内在任意但已知位置删除。

查找该位置需要线性时间,就像修改矢量一样。

列表的唯一优点是您在(大约)相同位置重复擦除(或插入)。

如果你或多或少地随机擦除,那么矢量的更好的记忆位置可能最终会胜出。

唯一可以确定的方法是衡量和比较。

答案 4 :(得分:0)

这取决于很多因素以及您如何使用数据。

一个因素:你需要擦除来维持收集的顺序吗?或者你可以接受改变秩序?

其他因素:馆藏中有哪些数据? (数字:英寸/浮动)||指针||对象

不遵守命令

如果数据是基本数字或指针,您可以继续使用vector,删除一个元素,您可以在已删除的位置复制向量的最后一个元素,然后pop_back()。这样就可以避免移动所有数据。

如果使用对象,如果您需要复制的对象很小,您仍然可以使用相同的方法。

保持秩序

也许List会成为你的朋友,仍然会建议一些测试,取决于数据大小,列表大小等等。