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