【问题标题】:STL internals: deque implementationSTL 内部结构:双端队列实现
【发布时间】:2011-08-09 08:37:19
【问题描述】:

我使用std::deque 来存储large collection of items
我知道双端队列是作为向量列表实现的。无法设置这些向量的大小,但我徘徊选择该大小的算法是什么。

【问题讨论】:

  • 哪个实现? STL 和 C++ 标准库指定接口,而不是实现。
  • 在 GNU 库的情况下(至少 gcc 4.4.5),大小为 512 字节,并且没有算法:“'512' 是可调的,但没有调查自继承 SGI 代码以来已完成。”

标签: c++ stl internals


【解决方案1】:

我的deque 实现,是源自HP/SGI 版本的GNU 实现,它不是向量列表;至少,不是std::vectors 中的std::list。 cmets 状态

*  In previous HP/SGI versions of deque, there was an extra template
*  parameter so users could control the node size.  This extension turned
*  out to violate the C++ standard (it can be detected using template
*  template parameters), and it was removed.
*
*  Here's how a deque<Tp> manages memory.  Each deque has 4 members:
*
*  - Tp**        _M_map
*  - size_t      _M_map_size
*  - iterator    _M_start, _M_finish
*
*  map_size is at least 8.  %map is an array of map_size
*  pointers-to-"nodes".  (The name %map has nothing to do with the
*  std::map class, and "nodes" should not be confused with
*  std::list's usage of "node".)

【讨论】:

  • 它会调整大小(按照标准的要求),它指向节点而不是将它们保持内联 - 所以它根本不像一个数组数组 - 相反,它就像一个向量指向数组分配的指针。
  • @larsmans:系统头文件必须使用保留名称作为其实现细节,以避免与包含头文件之前定义的任何宏发生冲突。
  • @MikeSeymour 当然,仅仅因为名称需要丑化,并不意味着它们也需要毫无意义或具有误导性。我对 MS STL 也有同样的抱怨。 _Eep_Ds?认真的吗?
【解决方案2】:

deque 被实现为向量的向量(向量列表会阻碍恒定时间随机访问)。辅助向量的大小取决于实现,常用算法是使用以字节为单位的常量大小。

【讨论】:

  • 这个恒定大小有多大? (例如在 Visual Studio 实现中)
  • 原始 SGI 实现使用 512。根据 Mike 对您问题的评论,G++ 仍在使用它。我不是 VC++ 的可靠消息来源——关于我所知道的一切都是在像这个这样的公共论坛上说的,我不记得有人提到过那个琐事。
  • 上次我深入研究 VC++ (2010) 时,它是 8 或 16 个字节(或单个对象,如果更大的话)的东西。然后我明白了 deque 在 VC++ 中的表现如此糟糕......
  • 这些向量的向量如何保证在开始时的恒定时间插入?
  • @Calmarius:在前面进行插入所需的工作量仅取决于第一个子向量的大小,而不是容器中元素的总数。就N 而言,它是恒定的。如果N 是十亿,那么第一个容器仍然可能只有 50 或 100 个元素(或实现选择的任何一个)。如果N 是 5 万亿,它不会花费 5,000 倍的时间。此外,如果第一个子向量的大小在它变得太大时通过拆分来保持“或多或少恒定”,那么就该子向量的N 而言,它也是“摊销常数”。
猜你喜欢
  • 1970-01-01
  • 2013-03-10
  • 2020-05-20
  • 2016-08-18
  • 2014-08-29
  • 1970-01-01
  • 2016-01-02
  • 2016-02-11
  • 2015-04-26
相关资源
最近更新 更多