[英]Why does std::queue use std::dequeue as underlying default container?
正如在cplusplus.com上读到的那样 , std::queue
实现如下:
队列实现为容器适配器,它是使用特定容器类的封装对象作为其底层容器的类,提供一组特定的成员函数来访问其元素。 元素被推入特定容器的“后面”并从其“前面”弹出。
底层容器可以是标准容器类模板之一或其他一些专门设计的容器类。 该底层容器应至少支持以下操作:
......
标准容器类deque和list满足这些要求。 默认情况下,如果没有为特定队列类实例化指定容器类,则使用标准容器双端队列 。
我很困惑为什么deque (类固醇上的双端队列)在这里被用作默认值,而不是list (这是一个双向链表)。
在我看来, std::deque
非常过分:它是一个双端队列,但也具有恒定时间元素访问和许多其他功能; 基本上是一个功能齐全的std :: vector bar'元素在内存中连续存储'保证。
由于普通的std::queue
只有很少的可能操作,在我看来,双向链表应该更有效率,因为需要在内部发生的管道要少得多。
那么为什么使用std::deque
作为默认值而不是std::list
实现std::queue
?
不要把list
想象为“这很难使用,并且缺少一些有用的功能,所以当我不需要这些功能时它必须是最好的选择”。
list
实现为带有缓存计数的双向链表。 有一小部分情况是最优的; 当你需要真正的,非常强大的引用/指针/迭代器稳定性。 当您在容器中间擦除并插入数量级时,比迭代到容器中间的次数更多。
这就是它。
通常实现std
数据类型,然后分析它们的性能和其他特性,然后写出标准“你必须保证这些要求”。 留下了一点摆动的空间。
因此,当他们编写queue
,有人可能会分析list
和deque
执行情况,并发现deque
速度有多快,因此默认使用deque
。
在实践中,有人可以发送具有可怕性能的deque
(例如,MSVC具有小块大小),但是使其比std::list
所需的更糟糕将是棘手的。 list
基本上要求每个元素一个节点,这会使内存缓存失效。
原因是双端队列比列表快几个数量级。 List分别分配每个元素,而deque分配大块元素。
list的优点是可以删除中间的元素,但队列不需要此功能。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.