【发布时间】:2013-08-07 15:35:33
【问题描述】:
在 C++11 之前的日子里,许多书籍作者建议在需要具有随机访问的动态大小容器的情况下使用 deque。这部分是因为deque 是比vector 移动通用的数据结构,但也因为vector 在C++ 11 之前的世界中没有提供方便的方法通过“缩小以适应”来缩小其容量。通过方括号运算符和迭代器间接访问元素的更大deque 开销似乎被更大的vector 重新分配开销所包含。
另一方面,有些事情并没有改变。 vector 仍然使用几何(即大小*因子)方案进行重新分配,并且仍然必须将其所有元素复制(或移动,如果可能)到新分配的空间中。关于在前面和/或中间插入/删除元素,它仍然是相同的旧 vector。另一方面,它提供了更好的参考局部性,尽管如果 deque 使用的块是“好大”的大小,那么对于许多应用程序来说,缓存方面的好处是可以争论的。
所以,我的问题是,鉴于 C++11 带来的变化,deque 是否应该继续作为动态大小/随机访问需求的转到/首选容器。
【问题讨论】:
-
在我看来,在 C++11 之前很久,很多人或大多数人都对这场辩论改变了态度。数据局部性实在是太好了。
-
vector::shrink_to_fit仍然是一个非绑定调用;实现可以随意忽略它。 -
尽管有这个建议,但我主要使用矢量,除非大小为 100 mb 或复制对象非常昂贵。
-
我找到了。 Herb Sutter 的GotW #54 可能是最广为人知的建议来源,它更喜欢
deque而不是vector。但就连他也改变了主意。 cpptalk.net/image-vp323385.html -- 在那里搜索他的帖子 -
尽可能使用向量。如果您不能使用向量,请重新设计您的解决方案,以便您可以使用向量。 --Alexander Stepanov