rt,这是别人让我帮忙问的,我没有达到这个实力。
我想手写 STL,实现 set 中的平衡树时遇到了问题。
set 有一个 erase(first,last) 的函数,可以删除 [first,last) 的结点,cppreference 说它的复杂度是 O(logn+d)(n 为 set 的大小,d 是两个迭代器的距离)
但是我看了标准库的实现(stl_tree.h),是这样的:
template<typename _Key, typename _Val, typename _KeyOfValue,
typename _Compare, typename _Alloc>
void
_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
_M_erase_aux(const_iterator __first, const_iterator __last)
{
if (__first == begin() && __last == end())
clear();
else
while (__first != __last)
erase(__first++);
}
我觉得这是 O(d×logn),很可能是我分析错了。
就想问一下这个为什么是 O(d+logn)。