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

时间:2016-12-12 13:55:27

标签: c++ c++11 stl queue stddeque

cplusplus.com上阅读时,std::queue的实施方式如下:

  

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

中弹出      

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

     

...

     

标准容器类 deque 列表可实现这些目标   要求。 默认情况下,如果没有为a指定容器类   特定的队列类实例化,标准容器 deque 是   使用。

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

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

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

为什么std::queue使用std::deque作为默认值而不是std::list来实现?{/ p>

2 个答案:

答案 0 :(得分:6)

不要再把list视为“使用起来很笨拙,而且缺少一些有用的功能,所以当我不需要这些功能时,它一定是最好的选择”。

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

这就是它。

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

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

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

答案 1 :(得分:2)

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

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