C++ C+后的矢量制导与矢量制导+;11增强功能

C++ C+后的矢量制导与矢量制导+;11增强功能,c++,c++11,C++,C++11,早在C++11之前,许多书的作者建议在需要随机访问的动态大小容器的情况下使用deque。这部分是因为deque是一种比vector更灵活的数据结构,但也是因为在C++11之前的世界中,vector没有提供一种方便的方法,通过“收缩以适应”来缩小其容量通过方括号运算符和迭代器间接访问元素的deque开销似乎被更大的vector重分配开销所包含 另一方面,有些事情没有改变vector仍然使用几何(即大小*因子)方案进行重新分配,并且stil必须将其所有元素复制(或移动,如果可能)到新分配的空间中。在

早在C++11之前,许多书的作者建议在需要随机访问的动态大小容器的情况下使用
deque
。这部分是因为
deque
是一种比
vector
更灵活的数据结构,但也是因为在C++11之前的世界中,
vector
没有提供一种方便的方法,通过“收缩以适应”来缩小其容量通过方括号运算符和迭代器间接访问元素的
deque
开销似乎被更大的
vector
重分配开销所包含

另一方面,有些事情没有改变
vector
仍然使用几何(即大小*因子)方案进行重新分配,并且stil必须将其所有元素复制(或移动,如果可能)到新分配的空间中。在前面和/或中间插入/删除元素方面,仍然是相同的
向量。另一方面,它提供了更好的引用位置,尽管如果
deque
使用的块大小“很大”,那么缓存的好处对于许多应用程序来说都是值得商榷的


因此,我的问题是,鉴于C++11带来的变化,
deque
是否应该继续作为动态大小/随机访问需求的首选容器。

一种语言+库的变化确实会产生影响,那就是当您有一个不可复制+不可移动的类型时(例如包含<代码>互斥< <代码> >或<代码>原子< /代码>变量)的类型。可以将这些存储在<代码> DEQue>代码中(通过<代码> EMPTITY *方法之一),但不能将它们存储在<代码>矢量< /代码>中。< /P> < P> JouttIS的C++标准库状态:(<强>何时使用容器< /强>秒7.12)

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

如果经常在开头和结尾插入和/或删除元素 序列结束时,应使用deque。还应使用 确定所使用的内部内存量是否重要 当删除元素时,容器会收缩 向量通常使用一块内存作为其元素,即deque 可能会包含更多元素,因为它使用多个块


在我看来,许多人或大多数人在那场辩论之后改变了他们的观点,早在C++11之前。数据局部性太好了。
vector::shrink_to_fit
仍然是一个非绑定调用;实现可以随意忽略它。尽管有这个建议,我主要使用vector,除非大小为100 mb或对象非常昂贵很难复制。我找到了。赫伯·萨特(Herb Sutter)可能是最广为人知的建议来源,他更喜欢
deque
而不是
vector
。但即使是他也改变了主意。--只要有可能,就搜索他的文章。如果你不能使用vectors,就重新设计你的解决方案,这样你就可以使用vectors。--亚历山大·斯捷潘诺维亚
emplace\u front
emplace\u back
emplace
不能用于此目的。我想对于稳定的向量存储,不可更改的元素也会起作用,对吗?@nosenseal:这取决于具体的实现,我不知道它是否已经升级到C++11。