std::map中的内存分配 我正在做一篇关于C++字典实现的报告(地图、字典、向量等)。

std::map中的内存分配 我正在做一篇关于C++字典实现的报告(地图、字典、向量等)。,c++,stl,map,complexity-theory,C++,Stl,Map,Complexity Theory,使用std::map的插入结果表明性能为O(logn)。在表现上也有持续的尖峰。我不是100%确定是什么导致了这一点;我认为它们是由内存分配引起的,但我没有找到任何文献/文档来证明这一点 谁能澄清这件事,或给我指出正确的方向 干杯。对于STL,经验方法并不是绝对必要的。当标准明确规定了操作的最小复杂性(如std::map插入)时,进行实验是没有意义的 我敦促您阅读该标准,以便在继续进行实验之前了解最小复杂性保证。当然,无论您正在测试的STL实现是什么,都可能存在bug;但是,流行的STL是经过良

使用std::map的插入结果表明性能为O(logn)。在表现上也有持续的尖峰。我不是100%确定是什么导致了这一点;我认为它们是由内存分配引起的,但我没有找到任何文献/文档来证明这一点

谁能澄清这件事,或给我指出正确的方向


干杯。

对于STL,经验方法并不是绝对必要的。当标准明确规定了操作的最小复杂性(如std::map插入)时,进行实验是没有意义的


我敦促您阅读该标准,以便在继续进行实验之前了解最小复杂性保证。当然,无论您正在测试的STL实现是什么,都可能存在bug;但是,流行的STL是经过良好调试的生物,使用非常广泛,所以我对此表示怀疑。

如果我没记错的话,std::map是一棵平衡的红黑树。当std::map确定底层树需要平衡时,可能会导致一些峰值。另外,当分配新节点时,操作系统可能会在分配部分造成一些峰值。

你说得对:这是O(logn)复杂性。但这是由于映射的排序性质(通常基于二叉树)

另请参见“插入”中的注释。最坏的情况是O(logn)和摊销O(1),如果您可以提示插入的位置


映射通常基于二叉树,需要进行平衡以保持良好的性能。您观察到的负载峰值可能对应于这个平衡过程

我认为行为在很大程度上取决于实现(因为STL没有指定如何实现,只是指定如何使用)。@restevens——这不对,STL应该如何行为有一个定义(即,每种容器的big-O性能应为多少)@rstevens:这是错误的。STL容器是根据不同操作的复杂性来定义的。std::map的GCC实现实际上是一个红黑树。我相信MS VS也使用红黑树,但我不是100%确定。尖峰很可能是树的重新平衡。我最初认为尖峰是由树木旋转引起的,但在地图中插入50000个项目之前,不会出现尖峰。在这个数字之后,尖峰会持续出现(大约)之后每25000个项目,每个项目的大小都是一致的。我回答得很晚,但这可能是有用的:平衡可以在每次插入时执行,操作量最少,因此我猜测的峰值是在达到预先分配给元素的内存量时执行的重新分配。