据我了解,任何支持 push_back()、pop_back() 和 back() 的容器都可以用作堆栈的底层容器,但默认情况下使用双端队列。我了解双端队列通常优于 vector (可以在开头和末尾添加元素),但在堆栈的情况下,我看不出有任何理由更喜欢双端队列。
最佳答案
I don't see any reason to prefer deques.
更喜欢适用于堆栈用例的双端队列的一个原因是,与在最坏情况下单个推回是线性的 vector 相比,单个推回具有最坏情况下的恒定复杂性(它在多个推回上摊销了恒定的复杂性)。这在 C++11 之前尤其重要,因为重新分配 vector 必须复制可能非常昂贵的元素。考虑元素本身是长字符串的情况。
另一个喜欢双端队列的原因是它们在收缩时释放内存。 vector 没有。因此,如果您的堆栈暂时变大,然后缩小并在执行的其余部分保持较小,那么底层 vector 将浪费大量内存。
从历史上看,当设计 STL 并因此选择默认值时,过去也存在非常大的 vector 问题,因为地址空间的大小没有(显着地或根本没有)超过内存量(这是在 64 位处理变得普遍之前)。地址空间有限的结果是内存碎片会使分配大型 vector 所需的大型连续内存块变得昂贵或不可能。此外,vector 通过释放旧缓冲区来增长的方式是导致此类碎片的行为。
https://stackoverflow.com/questions/71499571/