有我不理解的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
答案 0 :(得分:3)
该示例使用了insert
的重载,该重载接受“提示”迭代,以表明应在支持二进制树的哪一部分中插入新元素。该示例暗示将it
(已初始化为begin()
)在插入到空表中时提供了尽可能好的提示,但是在插入第二个元素时则没什么用处(也许根本没用)。 / p>
我不确定为什么该网站(从历史上来看并不是很好-我更信任cppreference.com)为什么对插入'b'
提出了效率方面的主张。该标准的要求是(以p
为提示迭代器):
将元素插入到尽可能靠近
p
之前的位置。
begin()
之前的位置不存在。如果有的话,不为第一个insert
提供提示可能会更有效。
在第二个insert
期间,'b'
位于begin()
,我们不希望insert
'c'
仅在{{1}之前},因此标准的“尽可能接近”开始了,尽管有提示,'b'
仍有望摸索到正确的位置。
更一般地说,当树上有更多元素时,提示会很有用,因此insert
实现只需检查提示附近的几个元素即可确保顺序,而无需从二叉树的根向下进行排序。