繁体   English   中英

为什么std :: queue使用std :: dequeue作为底层默认容器?

[英]Why does std::queue use std::dequeue as underlying default container?

正如在cplusplus.com读到的那样std::queue实现如下:

队列实现为容器适配器,它是使用特定容器类的封装对象作为其底层容器的类,提供一组特定的成员函数来访问其元素。 元素被推入特定容器的“后面”并从其“前面”弹出。

底层容器可以是标准容器类模板之一或其他一些专门设计的容器类。 该底层容器应至少支持以下操作:

......

标准容器类dequelist满足这些要求。 默认情况下,如果没有为特定队列类实例化指定容器类,则使用标准容器双端队列

我很困惑为什么deque (类固醇上的双端队列)在这里被用作默认值,而不是list (这是一个双向链表)。

在我看来, std::deque非常过分:它是一个双端队列,但也具有恒定时间元素访问和许多其他功能; 基本上是一个功能齐全的std :: vector bar'元素在内存中连续存储'保证。

由于普通的std::queue只有很少的可能操作,在我看来,双向链表应该更有效率,因为需要在内部发生的管道要少得多。


那么为什么使用std::deque作为默认值而不是std::list实现std::queue

不要把list想象为“这很难使用,并且缺少一些有用的功能,所以当我不需要这些功能时它必须是最好的选择”。

list实现为带有缓存计数的双向链表。 有一小部分情况是最优的; 当你需要真正的,非常强大的引用/指针/迭代器稳定性。 当您在容器中间擦除并插入数量级时,比迭代容器中间的次数更多。

这就是它。

通常实现std数据类型,然后分析它们的性能和其他特性,然后写出标准“你必须保证这些要求”。 留下了一点摆动的空间。

因此,当他们编写queue ,有人可能会分析listdeque执行情况,并发现deque速度有多快,因此默认使用deque

在实践中,有人可以发送具有可怕性能的deque (例如,MSVC具有小块大小),但是使其比std::list所需的更糟糕将是棘手的。 list基本上要求每个元素一个节点,这会使内存缓存失效。

原因是双端队列比列表快几个数量级。 List分别分配每个元素,而deque分配大块元素。

list的优点是可以删除中间的元素,但队列不需要此功能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM