继续阅读cplusplus.com http://www.cplusplus.com/reference/queue/queue/, std::queue
实现如下:
队列被实现为容器适配器,这些类
使用特定容器类的封装对象作为其
底层容器,提供一组特定的成员函数
访问其元素。元素被推到“后面”
特定的容器并从其“前面”弹出。
底层容器可能是标准容器类之一
模板或其他一些专门设计的容器类。这
底层容器至少应支持以下操作:
......
标准容器类deque and list满足这些
要求。默认情况下,如果没有指定容器类
特定队列类实例化,标准容器deque是
用过的。
我很困惑为什么deque(类固醇上的双端队列)在这里用作默认值,而不是list(这是一个双向链表)。
在我看来,这std::deque
非常大材小用:它是一个双端队列,而且还具有恒定时间元素访问和许多其他功能;基本上是一个全功能的 std::vector bar,“元素连续存储在内存中”保证。
作为一个正常人std::queue
只有很少的可能的操作,在我看来,双向链表应该更有效,因为内部需要进行的管道要少得多。
那么为什么是std::queue
实施使用std::deque
作为默认值,而不是std::list
?
别再想了list
“这用起来很尴尬,并且缺乏一堆有用的功能,所以当我不需要这些功能时它一定是最好的选择”。
list
被实现为具有缓存计数的双向链表。在少数情况下它是最佳的;当你需要非常非常强的引用/指针/迭代器稳定性时。当您在容器中间擦除和插入的次数比迭代次数多时to容器的中间。
就是这样。
The std
数据类型通常被实现,然后分析它们的性能和其他特征,然后编写标准说“你必须保证这些要求”。留下了一点回旋余地。
所以当他们写下queue
,有人可能描述了如何list
and deque
执行并发现速度快了多少deque
曾经,如此被使用deque
默认情况下。
在实践中,有人可以发送deque
性能很糟糕(例如,MSVC 的块大小很小),但比std::list
会很棘手。list
基本上要求每个元素一个节点,这使得内存缓存哭泣。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)