在C ++ 11增强之后deque vs向量指导

时间:2013-08-07 15:35:34

标签: c++ c++11

回到C ++前11天,许多图书作者建议使用deque来调用具有随机访问权限的动态大小的容器。这部分是由于deque是一个移动通用数据结构而不是vector这一事实,但也是由于前C ++ 11世界中vector的事实没有提供一种方便的方法来通过“缩小到适合”来减小其容量。通过括号运算符和迭代器间接访问元素的更大deque开销似乎被重新分配的更大vector开销所包含。

另一方面,有些事情没有改变。 vector仍然使用几何(即,尺寸*因子)方案进行重新分配,并且stil必须将其所有元素复制(或移动,如果可能)到新分配的空间中。关于在前部和/或中部插入/移除元素,它仍然是相同的旧vector。另一方面,它提供了更好的引用局部性,但如果deque使用的块是“大”的大小,那么许多应用程序可以为缓存带来好处。

所以,我的问题是,如果根据C ++ 11带来的变化,deque应继续保持转向/首选容器的动态大小/随机访问需求。

2 个答案:

答案 0 :(得分:4)

一种语言+库更改确实有所作为,当你有一个不可复制的+不可移动的类型(例如包含mutexatomic变量的类型时。您可以将这些内容存储在deque中(通过emplace_ *方法之一),但不能将其存储在vector中。

答案 1 :(得分:4)

Josuttis的C ++标准库声明:(何时使用哪个容器 Sec 7.12)

  

默认情况下,您应该使用向量。它具有最简单的内部数据   结构并提供随机访问。因此,数据访问是方便的   而且灵活,数据处理通常足够快。

     

如果您经常在开头插入和/或删除元素   在序列结束时,您应该使用 deque 。你也应该使用   deque如果重要的是内部存储器的使用量   当元素被移除时,容器会收缩。还有,因为   vector通常使用一块内存作为其元素,一个deque   可能包含更多元素,因为它使用了几个块。