SGI STL地图遍历

时间:2014-10-11 12:34:29

标签: c++ stl red-black-tree

我偶然发现了SGI的STL地图implementation(stl_map.h),并且它有一段用于查找项目的代码:

template <class _Key, class _Value, class _KeyOfValue, 
          class _Compare, class _Alloc>
typename _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>::iterator 
_Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>::find(const _Key& __k)
{
  _Link_type __y = _M_header;      // Last node which is not less than __k. 
  _Link_type __x = _M_root();      // Current node. 

  while (__x != 0) 
    if (!_M_key_compare(_S_key(__x), __k))
      __y = __x, __x = _S_left(__x);
    else
      __x = _S_right(__x);

  iterator __j = iterator(__y);   
  return (__j == end() || _M_key_compare(__k, _S_key(__j._M_node))) ? 
     end() : __j;
}

我一定是读错了,但在我看来它总是穿越整棵树。为什么一旦找到想要的密钥就不会停止?有人可以向我解释它是如何工作的吗?

我原本预计,在红黑树的情况下,首先要找出一个项目的密钥是否与搜索到的密钥相同,如果没有,则一步向左或向右。上面的代码似乎没有执行第一次检查。

编辑:例如,我想在下面的树中找到键“4”:

         4
       /   \
     2       6
    / \     / \
   1   3   5   7
  1. x是4
  2. !比较向左(4 <4),x为2,y为4)
  3. !比较向右(2 <4),x为3
  4. !比较向左(3&lt; 4),x为NULL
  5. 终止
  6. 我认为NULL只在叶子上。?

0 个答案:

没有答案