回到C ++前11天,许多图书作者建议使用deque
来调用具有随机访问权限的动态大小的容器。这部分是由于deque
是一个移动通用数据结构而不是vector
这一事实,但也是由于前C ++ 11世界中vector
的事实没有提供一种方便的方法来通过“缩小到适合”来减小其容量。通过括号运算符和迭代器间接访问元素的更大deque
开销似乎被重新分配的更大vector
开销所包含。
另一方面,有些事情没有改变。 vector
仍然使用几何(即,尺寸*因子)方案进行重新分配,并且stil必须将其所有元素复制(或移动,如果可能)到新分配的空间中。关于在前部和/或中部插入/移除元素,它仍然是相同的旧vector
。另一方面,它提供了更好的引用局部性,但如果deque
使用的块是“大”的大小,那么许多应用程序可以为缓存带来好处。
所以,我的问题是,如果根据C ++ 11带来的变化,deque
应继续保持转向/首选容器的动态大小/随机访问需求。
答案 0 :(得分:4)
一种语言+库更改确实有所作为,当你有一个不可复制的+不可移动的类型(例如包含mutex
或atomic
变量的类型时。您可以将这些内容存储在deque
中(通过emplace_
*方法之一),但不能将其存储在vector
中。
答案 1 :(得分:4)
Josuttis的C ++标准库声明:(何时使用哪个容器 Sec 7.12)
默认情况下,您应该使用向量。它具有最简单的内部数据 结构并提供随机访问。因此,数据访问是方便的 而且灵活,数据处理通常足够快。
如果您经常在开头插入和/或删除元素 在序列结束时,您应该使用 deque 。你也应该使用 deque如果重要的是内部存储器的使用量 当元素被移除时,容器会收缩。还有,因为 vector通常使用一块内存作为其元素,一个deque 可能包含更多元素,因为它使用了几个块。