我理解人们不能这样做的原因(再平衡之类的) :
iterator i = m.find(33);
if (i != m.end())
i->first = 22;
但是到目前为止(据我所知)更改键的唯一方法是从树中全部删除节点,然后用另一个键重新插入值:
iterator i = m.find(33);
if (i != m.end())
{
value = i->second;
m.erase(i);
m[22] = value;
}
在我看来,这似乎效率相当低下,原因还有很多:
遍历树三次(+ Balance)而不是两次(+ Balance)
值的另一个不必要的副本
不必要的释放,然后在树中重新分配节点
我发现分配和释放是这三者中最糟糕的。是我遗漏了什么,还是有更有效的方法?
我认为,在理论上,这应该是可能的,所以我不认为改变不同的数据结构是合理的。下面是我想到的伪算法:
在树中找到要更改其键的节点。
从树中分离 if (不要释放)
再平衡
更改分离节点内的密钥
将节点重新插入到树中
再平衡