构建时是否优化了STL地图容器(平衡树)?

时间:2012-05-03 09:13:01

标签: c++ stl map

如果我将有序(增加)元素序列插入到地图中,最终的二叉树是否会以某种方式进行优化?或者每个元素都会有一个孩子“它是对的”?这会使这样的树效率非常低,因为然后查找将是线性的。

我找不到有关插入STL地图的过程的详细信息。

5 个答案:

答案 0 :(得分:23)

C ++ 11标准(23.1)要求关联容器的insertfind的对数复杂度。从两个迭代器ij构造它们,使得[i, j)表示适当排序的值范围甚至需要具有线性时间复杂度。这是否意味着“最终的二进制树被优化”,或者地图是否是二进制树,是未指定的。

实际上,std::setstd::map和他们的多朋友几乎总是红黑树,因为这是STL的原始HP / SGI参考实施所具有的,而且都是现代的我所知道的C ++库来自该实现。

答案 1 :(得分:3)

通常,使用红黑树实现std::map,这是自平衡的。所以是的,它已经过优化。

如果插入有序数据,自平衡可能会花费更少,因为节点之间的交换不会那么频繁。

答案 2 :(得分:1)

C ++标准要求std :: map(ISO / IEC 14882的23.4.4.3)中任何元素的对数访问时间,因此std :: map必须实现为自平衡树。

答案 3 :(得分:0)

setmap通常会进行树平衡,因此找到的是O(log n)。许多操作的复杂性如下所示: http://www.cplusplus.com/reference/stl/

答案 4 :(得分:0)

优化了!

看看SGI's Standard Template Library Programmer's Guide。您将找到以下用于插入和查找元素的复杂性规范:

  
      
  • 插入范围的平均复杂度最多为O(N * log(size()+ N)),
  •   
  • 其中N是j - i。查找的平均复杂度至多是对数。
  •