【问题标题】:Simple linked list Vs STL::list. which one is best? [closed]简单链表 Vs STL::list。哪个最好? [关闭]
【发布时间】:2014-10-30 18:25:50
【问题描述】:

简单链表:

struct Node { 
int x;
Node *next;
};

从 STL 使用用户定义的简单链表和列表容器的主要优点/缺点是什么?拥有大量数据的 LL 的列表性能如何?

【问题讨论】:

  • 在现代 C++ 中,您可以使用 std::forward_list - 与您的简单列表一样轻量级,但具有方便的 STL 样式界面。但vector 通常是比这两个更好的选择。
  • 所有 STL 容器的主要优点是:(1) 它们已经实现 - 您不必花费任何时间编写它们,(2) 它们已经被很好地使用并且很好- 测试过,因此可能与新代码相比没有错误,(3) 有大量 C++ 程序员已经知道如何使用它们。
  • “简单链表 Vs STL::list”,两者都没有,链表性能绝对糟糕。
  • 根据 Bjarne Stroustrup std::vector 的说法,通常优于链表。 youtube.com/watch?v=YQs6IC-vgmo
  • 什么是STL::list?通常当有人说STL 时,我倾向于假设他们指的是标准库。但事实上,您在STLlist 之间使用双冒号对其进行了格式化,这使得您看起来像是指的是一个实际上名为STL 的库。也许this one

标签: c++ stl linked-list


【解决方案1】:

在大多数情况下,最好使用标准容器,因为它们经过测试并且在程序员中广为人知。考虑到标准 C++ 库有自己的单链表,命名为 like

std::forward_list

所以您的问题听起来像是使用用户定义的单链表或std::forward_list 更好。我建议使用std::forward_list

不过,标准 C++ 库需要一个带有方法 push_back 的单链表。和I already suggested that the C++ Committee should add such a container to the C++ standard library。我什至给它起了个名字! :)

std::x_forward_list

【讨论】:

  • 我记得他们一笑置之。
  • @Lightness Races in Orbit 这里除了你没有人笑。
  • 我可能想起了您的其他提议之一,这些提议经常归结为辱骂,这可能很有趣。至于这个,我已经为你的答案添加了一个链接。
  • @Lightness Races in Orbit 谢谢。
【解决方案2】:

从表面上看,这个问题似乎很简单,答案是“std::list 更安全、更高效,等等等等”。

但这些方面无关紧要。

std::list 通常比其他标准库容器没有优势。直到并包括 C++03,它可以提供恒定时间拼接,具体取决于实现。但在 C++11 中,通过要求其 size() 为常数时间(您可以让其中一个或另一个为常数时间,但不能两者兼而有之),消除了这种可能的优势。

因此,如果您想要恒定时间拼接,或链表的其他可能优势,您必须使用std::list以外的其他东西。

例如,您的 DIY 自制清单。


恒定时间大小要求:C++11 §23.2.1/4 表 96:

a.size() size_type distance(a.begin(), a.end()) 常量

其中的列是表达式返回类型操作语义复杂度

【讨论】:

  • list 确实具有稳定的迭代器和单个元素的恒定时间插入和删除(如果您知道它们在哪里)。这些有时是有用的好处。
  • @MikeSeymour:在顺序建立的位置进行恒定时间插入和删除并不难添加到例如顶部。 std::vector。然后避免std::list 的缓存破坏行为。 en.wikipedia.org/wiki/Gap_buffer
【解决方案3】:

就我个人而言,我发现只使用 STL 容器比每次想要使用时都设计一个链表要高效得多。这大概就是最大的好处了。时间就是金钱。

【讨论】:

    【解决方案4】:

    STL 是标准的、有大量文档的、已经存在并且已经过使用和测试,它是通用的并且适用于大多数类型,STL 容器的性能通常是标准的一部分,因此您将从标准或更好。

    可以根据您的需求专门定制自制列表,在某些情况下,这可能会让您根据数据的任何独特方面获得性能提升,但不能保证,性能只与您一样好为您的数据自己制作。您必须执行自己的测试并编写自己的实现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-08
      • 1970-01-01
      • 2010-09-13
      • 2013-06-14
      • 1970-01-01
      • 2013-06-10
      • 2016-06-15
      • 2021-12-23
      相关资源
      最近更新 更多