Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我要在C++;? 除了学术上的一些东西,从在C++中实现我自己的双链表,在已经有STD::列表的情况下,实现我自己的双链表有实际的现实优势吗?对于某项任务,我可以自己提高效率吗?或者std::list经过多年的改进,在大多数情况下都是双链表的最佳实现吗_C++_List - Fatal编程技术网

为什么我要在C++;? 除了学术上的一些东西,从在C++中实现我自己的双链表,在已经有STD::列表的情况下,实现我自己的双链表有实际的现实优势吗?对于某项任务,我可以自己提高效率吗?或者std::list经过多年的改进,在大多数情况下都是双链表的最佳实现吗

为什么我要在C++;? 除了学术上的一些东西,从在C++中实现我自己的双链表,在已经有STD::列表的情况下,实现我自己的双链表有实际的现实优势吗?对于某项任务,我可以自己提高效率吗?或者std::list经过多年的改进,在大多数情况下都是双链表的最佳实现吗,c++,list,C++,List,在已经有std::list的情况下,实现我自己的双链接列表有什么实际的好处吗 可能不会 对于某项任务,我能自己提高工作效率吗 也许-取决于任务。您可能只需要一个单链表,例如,它可能会更快 或者std::list经过多年的改进,在大多数情况下都是双链表的最佳实现 可能吧 所有这些东西的最佳答案可能是“使用标准的实现直到它不起作用,然后找出你要做什么”。 < P>“为什么我要在< C++中使用双链接表? 你不会的。即使您需要一个双链接列表,您也可以避免重新发明轮子,而使用现有的实现。如果您必须问这个

在已经有std::list的情况下,实现我自己的双链接列表有什么实际的好处吗

可能不会

对于某项任务,我能自己提高工作效率吗

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

或者std::list经过多年的改进,在大多数情况下都是双链表的最佳实现

可能吧

所有这些东西的最佳答案可能是“使用标准的实现直到它不起作用,然后找出你要做什么”。

< P>“为什么我要在< C++中使用<强”>双链接表?


你不会的。即使您需要一个双链接列表,您也可以避免重新发明轮子,而使用现有的实现。

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

您几乎不希望或不需要实现自己的
列表。就这一点而言,如果标准库涵盖了您自己的任何内容,您几乎永远不会想要或需要重新实现它


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

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

具体来说,
std::list
在C++11中是必需的,并且在C++03中是推荐的,它具有恒定的时间
size()
。也就是说,元素的数量必须存储在对象中

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

但是,如果您正在进行大量拼接,那么您可能更希望以相反的方式进行这些操作--恒定时间
splice()
size()
函数,在最坏的情况下,这是线性时间(当列表中的拼接操作比上次更新大小的时间更晚时)


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

不知怎的,我觉得这个问题就像走进一个机械车间,大喊“我为什么要发明自己的发动机”?。通常,因为你不知道已经有一个好的引擎,或者因为你怀疑标准引擎对你的工作真的有那么好。但首先,你应该测试引擎,它通常对你有好处。如果有疑问,请查看实际的
std::list
实现,然后忘记自己实现它。这里有一些用例:在编写自己的
std::list
替换之前,您应该研究编写自己的分配器。相关:最近,如果您只需要一个单链表,那么就有
std::forward_list