【问题标题】:deque vs vector guidance after C++11 enhancements [duplicate]C ++ 11增强后的双端队列与矢量指导[重复]
【发布时间】: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

标签: c++ c++11


【解决方案1】:

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

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

如果您经常在开头插入和/或删除元素,并且 在序列结束时,您应该使用 deque。您还应该使用 deque 如果重要的是使用的内部内存量 移除元素时容器会缩小。另外,因为一个 vector 通常使用一块内存作为它的元素,一个双端队列 可能能够包含更多元素,因为它使用了多个块。

【讨论】:

    【解决方案2】:

    当你有一个不可复制 + 不可移动的类型(例如包含 mutex 或 atomic 变量的类型)时,确实会产生影响的一种语言 + 库更改。您可以将它们存储在deque 中(通过emplace_* 方法之一),但不能将它们存储在vector 中。

    【讨论】:

    • 通过emplace_front 或emplace_back。 emplace 不能用于此目的。
    • 我猜对于 stable_vector 存储不可移动元素也可以,对吧?
    • @NoSenseEtAl: 要看具体实现,不知道是不是已经升级到C++11了。
    猜你喜欢
    • 2013-05-21
    • 2012-07-25
    • 2015-05-01
    • 2014-03-30
    • 2017-05-06
    • 2013-11-13
    • 1970-01-01
    • 2016-09-25
    • 2020-10-29
    相关资源
    最近更新 更多