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

2024-05-15

继续阅读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(使用前将#替换为@)

为什么 std::queue 使用 std::dequeue 作为底层默认容器? 的相关文章

随机推荐