为什么我想在C++中实现我自己的双链表

Why would I want to implement my own doubly linked list in C++?

本文关键字:我自己 自己的 链表 实现 C++ 为什么      更新时间:2023-10-16

除了从C++中实现我自己的双链表中学习一些东西的学术方面之外,当已经有std::list时,实现我自己的双链表有什么实际的现实优势吗?我是否可以自己为某项任务提高效率,或者 std::list 多年来已经进行了如此多的改进,以至于在大多数情况下它是双链表的最佳实现?

当已经有 std::list 时,实现我自己的双链表有什么实际的现实优势吗?

应该不会。

我能不能自己让事情更有效率来完成某项任务,

也许 - 取决于任务。 例如,您可能只需要一个单向链表,最终可能会更快。

或者 std::list 多年来是否已经完善得如此之多,以至于在大多数情况下它是双链表的最佳实现?

可能。

所有这些东西的最佳答案可能是"使用标准实现,直到它不起作用,然后弄清楚你要怎么做。

"我为什么要在C++中实现双链表?">

你不会。即使你需要一个双向链表,你也会避免重新发明轮子并使用现有的实现

如果你必须问这个问题,答案是否定的

你几乎永远不会想要或需要实现自己的list。 就此而言,如果标准库涵盖了自己的任何东西,您几乎永远不会想要或需要重新实现它。

也有例外。 这些例外是,嗯...特殊。 出于性能原因,通常是在性能要求极端的情况下,会例外。 但是,只有当您已经证明标准库提供的功能对于您的特定用途来说是一个可衡量的问题时,才能负责任地做出这些例外。

是的,对于某个任务,双向链表可能比std::list更有效。在std::list中有一个算法复杂性权衡,你的任务可能会从相反的决定中受益。

具体来说,C++11 中需要std::list,C++03 中建议使用常时size()。也就是说,元素的数量必须存储在对象中。

这意味着 splice() 的 4 参数版本必然具有线性复杂性,因为它需要计算从一个列表移动到另一个列表的元素数量才能更新两个大小(除了某些特殊情况,例如源列表在拼接后为空,或者两个列表是同一个对象(。

但是,如果你正在做大量的拼接,那么你可能更喜欢相反的方式 - 恒定时间splice()和一个在最坏情况下是线性时间的size()函数(当拼接在列表中完成的时间比上次更新大小时

(。

碰巧的是,GNU 的 std::list 实现做出了这个选择,并且不得不改变 C++11 一致性。因此,即使这是您想要的,您也不一定要自己完全实现它。只需清除旧的 GNU 代码并更改名称,使其成为有效的用户代码。