回到C++出现之前的11天,许多书籍作者建议在需要随机访问的动态大小容器的情况下使用deque
。这在一定程度上是因为deque
是一种比vector
更通用的数据结构,但也是因为在C++11之前的世界中,vector
没有提供一种方便的方法来通过“收缩以适应”来缩小其容量。通过括号运算符和迭代器间接访问元素的较大deque
开销似乎被重新分配的较大vector
开销所包含。
另一方面,有些事情并没有改变。vector
仍然使用几何(即大小*因子)方案进行重新分配,并且仍然必须将其所有元素复制(或移动,如果可能)到新分配的空间中。关于在前面和/或中间插入/删除元素,它仍然是相同的旧vector
。另一方面,它提供了更好的引用局部性,尽管如果deque
使用的块是“良好的大”大小,那么对于许多应用程序来说,缓存的好处是可以争辩的。
因此,我的问题是,鉴于C++11带来的变化,deque
是否应该继续作为动态大小/随机访问需求的go to /首选容器。
发布于 2013-08-07 15:45:58
当你有一个不可复制+不可移动的类型(比如一个包含mutex
或atomic
变量的类型)时,一个语言+库的改变确实会产生影响。您可以将它们存储在deque
中(通过emplace_
*方法之一),但不能将它们存储在vector
中。
发布于 2013-08-07 15:49:22
Josuttis的C++标准库声明:(When to use When container Sec7.12)
默认情况下,您应该使用向量。它具有最简单的内部数据结构,并提供随机访问。因此,数据访问是方便和灵活的,并且数据处理通常足够快。
如果经常在序列的开头和结尾处插入和/或删除元素,则应使用双队列。如果删除元素时容器所使用的内部内存量很重要,那么您也应该使用deque。此外,因为向量通常使用一个内存块来存储其元素,所以双端队列可能能够包含更多元素,因为它使用了多个内存块。
https://stackoverflow.com/questions/18107630
复制