cplusplus.com 参考文献上有一个我不明白的例子。
在下面的示例中,当插入 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
该示例使用接受"提示"迭代的重载insert
来表示应在支持二叉树的哪个部分插入新元素。 该示例暗示it
- 初始化为begin()
- 在插入空表时尽可能好地提示,但在插入第二个元素时不太有用(可能根本没有用(。
我不确定为什么那个网站(历史上不是很好 - 我更信任 cppreference.com(对插入'b'
做出效率断言。 该标准的要求是(p
是提示迭代器(:
元素插入尽可能靠近
p
之前的位置。
begin()
之前的位置不存在。 如果有的话,不为第一个insert
提供提示可能会更有效。
在第二个insert
,'b'
处于begin()
,我们不想insert
'c'
"就在"'b'
之前,所以标准的"尽可能接近"开始了,尽管有暗示,insert
可以预期会摸索到正确的位置。
更一般地说,当树具有更多元素时,提示会很有用,因此insert
实现可以只检查提示附近的几个元素以确保顺序,而无需从二叉树的根向下工作。