在C ++中将插入与地图结合使用的效率

时间:2018-09-21 01:30:57

标签: c++ dictionary insert

有我不理解的an example on cplusplus.com reference

在下面的示例中,当插入C时,为什么效率不如插入B?他们有什么不同?

  // second insert function version (with hint position):
  std::map<char,int>::iterator it = mymap.begin();
  mymap.insert (it, std::pair<char,int>('b',300));  // max efficiency inserting
  mymap.insert (it, std::pair<char,int>('c',400));  // no max efficiency inserting

1 个答案:

答案 0 :(得分:3)

该示例使用了insert的重载,该重载接受“提示”迭代,以表明应在支持二进制树的哪一部分中插入新元素。该示例暗示将it(已初始化为begin())在插入到空表中时提供了尽可能好的提示,但是在插入第二个元素时则没什么用处(也许根本没用)。 / p>

我不确定为什么该网站(从历史上来看并不是很好-我更信任cppreference.com)为什么对插入'b'提出了效率方面的主张。该标准的要求是(以p为提示迭代器):

  

将元素插入到尽可能靠近p之前的位置。

begin()之前的位置不存在。如果有的话,不为第一个insert提供提示可能会更有效。

在第二个insert期间,'b'位于begin(),我们不希望insert 'c'仅在{{1}之前},因此标准的“尽可能接近”开始了,尽管有提示,'b'仍有望摸索到正确的位置。

更一般地说,当树上有更多元素时,提示会很有用,因此insert实现只需检查提示附近的几个元素即可确保顺序,而无需从二叉树的根向下进行排序。