C++ 向量与列表的真实示例,展示了两种方法各自比另一种更有效的场景

C++ 向量与列表的真实示例,展示了两种方法各自比另一种更有效的场景,c++,visual-c++,c++11,C++,Visual C++,C++11,我在一次面试中被问到这个问题,我愣住了。这个问题让我深思熟虑,所以我想我也会问你们中是否有人能帮我举个例子。你能不能在你的真实世界中关注效率的例子,说明一个比另一个更有效,反之亦然 多谢 编辑: 谢谢大家的意见。我只是想澄清一下,我问的是真实世界的例子,不要担心它们是否是琐碎的例子,任何例子都可以。如果你想有效地随机访问一个项目,而不关心插入和删除的效率,请使用vector 否则,如果您可能有许多插入和删除操作,而不关心项目的访问,请使用列表。如果您希望有效地随机访问项目,而不关心插入和删除的效

我在一次面试中被问到这个问题,我愣住了。这个问题让我深思熟虑,所以我想我也会问你们中是否有人能帮我举个例子。你能不能在你的真实世界中关注效率的例子,说明一个比另一个更有效,反之亦然

多谢

编辑:


谢谢大家的意见。我只是想澄清一下,我问的是真实世界的例子,不要担心它们是否是琐碎的例子,任何例子都可以。

如果你想有效地随机访问一个项目,而不关心插入和删除的效率,请使用vector


否则,如果您可能有许多插入和删除操作,而不关心项目的访问,请使用列表。

如果您希望有效地随机访问项目,而不关心插入和删除的效率,请使用vector


否则,如果您可能有许多插入和删除操作,而对项目的访问不太关心,请使用列表。

他询问的是关于这方面的真实示例,因此我假设您询问的是这些数据结构的实际应用

向量优于列表:任何需要网格表示的应用程序,例如(任何计算机视觉算法),其中网格的大小事先未知(否则将使用数组)。在这种情况下,您需要随机访问容器元素,向量为O(1)(恒定时间)。另一个例子是,例如,当您必须构建一棵树时(例如,对于基于树的路径规划算法)。您事先不知道节点的数量,所以您只需一直向后推节点,并将父节点的索引存储在它们的节点中


<强>列表优于向量:当你要在容器的中间做很多插入/删除时(注意,中间I不是第一个/最后一个元素)。想象一下,你正在实施一个视频游戏,其中有许多敌人出现,你必须杀死他们。每次你杀死一个敌人时,正确的做法是杀死那个敌人,这样它就不会消耗内存。然而,你不太可能杀死敌人1。因此,您需要从敌人列表中删除该敌人。如果您正在实现类似插入排序的算法,那么列表也会非常有用,因为您一直在移动列表中的元素。

他询问的是关于这方面的真实示例,因此我假设您询问的是这些数据结构的实际应用

向量优于列表:任何需要网格表示的应用程序,例如(任何计算机视觉算法),其中网格的大小事先未知(否则将使用数组)。在这种情况下,您需要随机访问容器元素,向量为O(1)(恒定时间)。另一个例子是,例如,当您必须构建一棵树时(例如,对于基于树的路径规划算法)。您事先不知道节点的数量,所以您只需一直向后推节点,并将父节点的索引存储在它们的节点中


<强>列表优于向量:当你要在容器的中间做很多插入/删除时(注意,中间I不是第一个/最后一个元素)。想象一下,你正在实施一个视频游戏,其中有许多敌人出现,你必须杀死他们。每次你杀死一个敌人时,正确的做法是杀死那个敌人,这样它就不会消耗内存。然而,你不太可能杀死敌人1。因此,您需要从敌人列表中删除该敌人。如果您正在实施插入排序算法,列表也会很有帮助,因为您一直在移动列表中的元素。

第一次听之前,您应该避免的正常感觉是,默认情况下,在大学学习的主题应按所学内容应用(Big-O)。有关两个容器的方法的Big-O,请参阅参考资料

<> >代码> STD::列表(双链表),如果在容器的中间(是大性能增益应该出现的地方),在插入、删除(<强> O(1)< /强>)中应该有更多的性能。

这句话的问题是硬件喜欢连续内存,并且已经发明了许多功能(预取、缓存等),编译器已经过优化以识别模式(例如:memcpy、memmove),并生成最佳性能代码(有时直接在汇编中)

前面的考虑得出结论,即使是大容器大小(例如:50万,我认为这是Bjarne测试的最大大小)
std::vector
在性能上优于
std::list
(在内存大小上要多得多)

在新标准(C++11)中,由于移动语义使得grow-In
push_-back
在某些情况下成本更低,这种差异变得更大

我的建议是一直使用
std::vector
,直到你有理由不使用为止

更多信息:


更多信息,请观看视频:

第一次听之前,你应该避免的正常感觉,默认情况下,你更喜欢在大学里学习的主题应用为已学(Big-O)。有关两个容器的方法的Big-O,请参阅参考资料

<> >代码> STD::列表(双链表),如果在容器的中间(是大性能增益应该出现的地方),在插入、删除(<强> O(1)< /强>)中应该有更多的性能。

这句话的问题是硬件喜欢连续内存,并且已经发明了很多功能来利用它(预取、缓存等),编译器已经过优化以识别