为什么我想在C++中实现我自己的双链表
Why would I want to implement my own doubly linked list in C++?
除了从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 代码并更改名称,使其成为有效的用户代码。
- 找到所有与自己求和的数字X的快速方法,去掉一个数字得到N
- C++:我自己类的动态数组
- 如何设计一个安全地管理自己一生的Qobject
- C++:摧毁自己体内的lambda
- 关于使用我自己创建的类使用优先级队列的问题
- 对自己制造的类对象的情况不敏感分类
- Dokan:我应该自己处理文件共享和访问权限吗?
- 我自己解决的。指针,但我不知道为什么
- C - 如何将自己类型的值插入集合中
- 修改自己类的本地实例
- C++ stl unordered_map,线程安全,其中每个线程仅访问其自己分配的键,并且可以编辑该值
- 我已经寻找了MPI函数Scatterv的实现,但是我发现了任何可以帮助我编写自己的函数的东西
- 我自己类型的多维数组
- 我发现自己无法理解MPI_Gatherv的参数"recvcounts"
- 如何让我自己编写的迭代器支持 ->?
- 我应该总是用一个有自己索引的一维向量,还是一个多维向量
- C++:将自己结构的地址作为参数传递给pthread_create时出错:What覆盖了我的数据
- "addin.XLL is in a different format"问题,无法打开我自己创建的xll
- 如何在主程序 c++ 中使用我自己制作的数组头文件
- 创建由我自己签名的OpenSSL证书