c++ - 为什么 deques 默认用作堆栈的底层容器,而 vectors 可以做到这一点?

据我了解,任何支持 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/

相关文章:

javascript - 我将如何在 P5.js 的 Canvas 上的两个位置之间创建点?

reactjs - webpack-cli : Invalid options object. De

amazon-web-services - 如何将事件从 EventBridge 发送到 Lambd

c++ - 没有非空函数的返回语句是否是未定义的行为,其中控制永远不会结束?

laravel - 如何通过单击进入 vs 代码中的一个类

r - 取消列出嵌套列表的倒数第二个列表

javascript - 使用javascript更新foreach循环中的数组对象

python - 给定一个数字,找到到达它的序列

javascript - 找时间在一张图中写一个数字

typescript - 我可以根据参数更改返回类型吗