对于我的应用程序,我正在使用STD向量。我在最后插入向量,但是从向量中随机删除,即元素可以从中间,前面的任何地方擦除。这两个只是要求,1)在最后插入2)从任何地方擦除。
因此,我应该使用STD List,因为擦除会导致数据移位。或者我会出于任何原因在我的代码中保留Vector?
请发表评论,如果Vector是更好的选择,那么在这里列出会更好吗?
答案 0 :(得分:4)
使用std::vector
超过std::list
的一个关键原因是cache locality。在这方面列表很糟糕,因为它的元素可能(并且通常是)碎片化在你的记忆中。这将显着降低性能。
有些人会建议几乎总是使用std::vector
。在性能方面,缓存局部性通常比插入或删除的复杂性更重要。
Here's a video about Bjarne Stroustrup's opinion regarding subject
答案 1 :(得分:2)
我会把你推荐给这个备忘单,结论就是清单。
答案 2 :(得分:1)
在这种情况下,列表最有可能更好。 list
超过vector
的优势在于它支持在任意位置删除并且具有恒定的复杂性。如果您需要对容器元素进行常量索引操作,那么vector
只会是更好的选择。您仍然必须考虑要删除的元素如何传递给您的函数以进行删除。如果只传递索引,vector将能够在常量时间内找到该元素,而在列表中则必须进行迭代。在这种情况下,我会对这两个解决方案进行基准测试,但我仍然打赌列表表现更好。
答案 3 :(得分:1)
列表支持在常量时间内在任意但已知位置删除。
查找该位置需要线性时间,就像修改矢量一样。
列表的唯一优点是您在(大约)相同位置重复擦除(或插入)。
如果你或多或少地随机擦除,那么矢量的更好的记忆位置可能最终会胜出。
唯一可以确定的方法是衡量和比较。
答案 4 :(得分:0)
这取决于很多因素以及您如何使用数据。
一个因素:你需要擦除来维持收集的顺序吗?或者你可以接受改变秩序?
其他因素:馆藏中有哪些数据? (数字:英寸/浮动)||指针||对象
不遵守命令
如果数据是基本数字或指针,您可以继续使用vector
,删除一个元素,您可以在已删除的位置复制向量的最后一个元素,然后pop_back()
。这样就可以避免移动所有数据。
如果使用对象,如果您需要复制的对象很小,您仍然可以使用相同的方法。
保持秩序
也许List会成为你的朋友,仍然会建议一些测试,取决于数据大小,列表大小等等。