std :: map中的内存分配

时间:2009-02-08 15:57:28

标签: c++ stl map complexity-theory

我正在做各种C ++字典实现的报告(地图,字典,向量等)。

使用std :: map进行插入的结果表明性能为O(log n)。性能也有一致的高峰。我不是百分之百确定是什么造成了这种情况;我认为它们是由内存分配引起的,但我找不到任何文献/文档来证明这一点是不成功的。

任何人都可以清楚这件事或指出我正确的方向吗?

干杯。

3 个答案:

答案 0 :(得分:4)

你是对的:它是O(log n)的复杂性。但这是由于地图的排序性质(通常是基于二叉树的)。

另见http://www.sgi.com/tech/stl/UniqueSortedAssociativeContainer.html插入注释。最糟糕的情况是O(log n)并且如果你可以暗示在哪里进行插入,则摊销O(1)。

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

答案 1 :(得分:2)

在STL方面,经验方法并不是绝对必要的。当标准清楚地规定诸如std :: map插入之类的操作的最小复杂性时,没有必要进行实验。

我建议您阅读标准,以便在继续实验之前了解最低复杂性保证。当然,在您正在测试的任何STL实现中可能存在错误;但是流行的STL是经过良好调试的生物并且使用非常广泛,所以我对此表示怀疑。

答案 2 :(得分:2)

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