Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ STL内部:deque实现_C++_Stl_Internals - Fatal编程技术网

C++ STL内部:deque实现

C++ STL内部:deque实现,c++,stl,internals,C++,Stl,Internals,我正在使用用于存储的。 我知道deques是作为向量列表实现的。这些向量的大小无法设置,但我想知道选择该大小的算法是什么 deque被实现为向量的向量(向量列表将阻碍恒定时间随机访问)。次要向量的大小取决于实现,常用的算法是使用以字节为单位的恒定大小。Mydeque实现,即从HP/SGI版本派生的GNU实现,不是向量列表;至少,不是std::vectors的std::list。评论指出 * In previous HP/SGI versions of deque, there was an e

我正在使用用于存储的。

我知道deques是作为向量列表实现的。这些向量的大小无法设置,但我想知道选择该大小的算法是什么

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

My
deque
实现,即从HP/SGI版本派生的GNU实现,不是向量列表;至少,不是
std::vector
s的
std::list
。评论指出

*  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".)
*在以前的HP/SGI版本的deque中,有一个额外的模板
*参数,以便用户可以控制节点大小。这个分机转弯了
*违反C++标准(可以使用模板检测)
*模板参数),并将其删除。
*
*下面是deque如何管理内存。每个deque有4名成员:
*
*-Tp**
*-尺寸\u t\u地图\u尺寸
*-迭代器_M_开始,_M_完成
*
*地图大小至少为8%map是一个map\u大小的数组
*指向“节点”的指针。(名称%map与
*映射类和“节点”不应与
*std::列表中“节点”的用法。)

恒定大小有多大?(例如在VisualStudio实现中)原始SGI实现使用512。根据Mike对您的问题的评论,G++仍在使用该选项。关于VC++,我不是一个可靠的消息来源——我所知道的一切都是在像这样的公共论坛上说的,我不记得有人提到过这些琐事。上次我钻研VC++(2010)时,它是一些愚蠢的东西,比如8或16个字节(或者一个更大的对象)。当deque在VC++中表现得如此糟糕时,我就明白了……这些向量如何保证开始时的恒定插入时间?@Calmarius:在前端插入所需的工作量完全取决于第一个子向量的大小,而不是容器中的元素总数。到目前为止,它对于
N
是恒定的。如果
N
为10亿,则第一个容器仍然只有50或100个元素(或实现选择的任何元素)。如果
N
为5万亿,则不需要花费5000倍的时间。此外,如果第一个子向量的大小在其增长过大时通过拆分而保持“或多或少的恒定”,那么它也是相对于该子向量的
N
的“摊销常数”。哪种实现?STL和C++标准库指定接口,而不是实现。在GNU库(至少GCC 4.4.5)的情况下,大小是512字节,并且没有算法:“512”是可调的,但是自从继承SGI代码以来没有进行过调查。“它调整大小(标准要求它),它指向节点,而不是内联保存它们-因此它根本不像数组数组-而是类似于指向数组分配的指针向量。@larsmans:系统头必须使用保留名称作为其实现细节,为了避免与包含标题之前定义的任何宏发生冲突。@MikeSeymour当然,仅仅因为名称需要修饰,并不意味着它们也需要毫无意义或具有误导性。我对微软STL也有同样的抱怨<代码>\u Eep\u Ds?认真地