在cplusplus.com上阅读时,std::queue
的实施方式如下:
队列实现为容器适配器,它们是类 使用特定容器类的封装对象作为其 底层容器,提供一组特定的成员函数 访问其元素。元素被推入" back"的 特定容器,从其前面"。
中弹出底层容器可能是标准容器类之一 模板或其他一些专门设计的容器类。这个 底层容器应至少支持以下操作:
...
标准容器类 deque 和列表可实现这些目标 要求。 默认情况下,如果没有为a指定容器类 特定的队列类实例化,标准容器 deque 是 使用。
我很困惑为什么 deque (类固醇上的双端队列)在这里被用作默认值,而不是 list (这是一个双重的 - 链表)。
在我看来,std::deque
非常过分:它是一个双端队列,但也有恒定时间元素访问和许多其他功能;基本上是一个功能齐全的std :: vector bar,'元素在内存中连续存储'保证。
正常std::queue
只有很少的可能操作,在我看来,双向链表应该更有效率,因为需要在内部发生的管道要少得多。
为什么std::queue
使用std::deque
作为默认值而不是std::list
来实现?{/ p>
答案 0 :(得分:6)
不要再把list
视为“使用起来很笨拙,而且缺少一些有用的功能,所以当我不需要这些功能时,它一定是最好的选择”。
list
实现为具有缓存计数的双向链表。有一小部分情况是最优的;当你需要真正的,非常强大的引用/指针/迭代器稳定性。当您在容器中间擦除并插入数量级时,比在容器中间迭代 更频繁。
这就是它。
通常实现std
数据类型,然后分析它们的性能和其他特性,然后写出标准“你必须保证这些要求”。剩下一点摆动的空间。
因此,当他们撰写queue
时,有人可能会分析list
和deque
的执行情况并发现deque
的速度有多快,因此默认使用deque
在实践中,某人可能会发送性能极差的deque
(例如,MSVC的块大小很小),但是使其比std::list
所需的更糟糕会很棘手。 list
基本上要求每个元素一个节点,这会使内存缓存失效。
答案 1 :(得分:2)
原因是双端队列比列表快几个数量级。 List分别分配每个元素,而deque分配大块元素。
list的优点是可以删除中间的元素,但队列不需要此功能。