【问题标题】:Difference between list and forward_list performance?list 和 forward_list 性能之间的区别?
【发布时间】:2019-01-31 14:41:21
【问题描述】:

与 c++11 一样,我们有两种类型的列表:

std::list<int> lst = { 1, 2, 3, 4, 5 };

std::forward_list<int> flst = { 5, 4, 3, 2, 1};

我们知道list是基于双向链表的,而forward_list是基于单链表的。

我们应该如何决定使用哪一个?上面的任何列表是否有任何性能优势?

【问题讨论】:

  • "Compared to std::list this container provides more space efficient storage when bidirectional iteration is not needed."。因此,如果您已经设置使用链表,并且不需要双向迭代,请选择std::forward_list,而如果您需要双向迭代能力,请使用std::list。但在做出此决定之前,请确保比较您是否真的需要一个链表,以及连续存储随机访问 std::vectorstd::array 是否是一个可行的替代方案。
  • @Azeem 请注意,该线程中接受的答案非常做作(到了误导的程度),使用 1 字节大小的对象的链表(在这种情况下,std::list 中的附加指针看起来会非常耗费内存)。链接问答中未接受的答案进行了更合理的比较。
  • 决定很简单。永远不要使用任何一种。总是有更好的数据结构。嗯,几乎总是。如果您面临使用链表的必要性,那么您正在做一些非常深奥的事情,因此对您没有帮助。
  • @n.m.我不会走那么远,但是是的,你们中的每个人都用“不要使用标准列表”回答了关于标准列表的每个问题,你的准确率会超过 99%。

标签: c++ list c++11 stl forward-list


【解决方案1】:

我们应该如何决定使用哪一个?

决定是否需要双向迭代。如果前向迭代足够好,请使用std::forward_list,除非您需要支持早于 C++11 的 C++ 版本,可能只有 std::list

上面的任何一个列表是否有任何性能优势?

std::forward_list 消除了每个节点的指针(具有数据缓存和内存子系统的所有附带好处),而std::list 提供恒定时间迭代器递减。

但在实践中,这些容器都没有像上计算机科学学校时所认为的那样广泛使用。 std::vector 的真实性能对于很多应用程序来说都是优越的,而且它的内存使用量总是更少。需要列表的要求更高的应用程序最好考虑标准 C++ 不提供的侵入式列表。

【讨论】:

    【解决方案2】:

    除了john-zwinck所说的,如果你必须使用链表,在做决定时要记住以下几点:

    std::forward_list 由于其性质,最后没有修饰函数:

    push_back、pop_back、emplace_back

    此外,根据std::liststd::forward_list 不提供size 成员函数以提高效率。 std::listsize 函数在 C++11 中给出了恒定时间内的元素数量。另一方面,它需要为内部计数器提供一些额外的存储空间,这会降低插入和移除的效率。为了达到std::forward_list 的大小,距离算法可以与begin()end() 函数一起使用,但此操作需要线性时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-09
      • 2015-05-22
      • 2015-07-01
      • 2015-09-02
      • 2017-12-23
      • 2011-05-15
      • 2012-10-06
      • 2013-07-11
      相关资源
      最近更新 更多