c++ - 为什么 STL 函数使用节点的颜色来计算 std::map 节点前任
问题描述
我正在查看 libstdc++ 的实现,std::map
并注意到迭代器递增和递减函数并不完全对称。local_Rb_tree_decrement函数(又名前身)有一个额外的子句检查节点的颜色:
static _Rb_tree_node_base*
local_Rb_tree_decrement(_Rb_tree_node_base* __x) throw ()
{
if (__x->_M_color == _S_red
&& __x->_M_parent->_M_parent == __x)
__x = __x->_M_right;
else if (__x->_M_left != 0)
{
_Rb_tree_node_base* __y = __x->_M_left;
while (__y->_M_right != 0)
__y = __y->_M_right;
__x = __y;
}
else
{
_Rb_tree_node_base* __y = __x->_M_parent;
while (__x == __y->_M_left)
{
__x = __y;
__y = __y->_M_parent;
}
__x = __y;
}
return __x;
}
第一种情况的目的是什么?为什么节点的颜色会以任何方式影响树的遍历?为什么它与local_Rb_tree_increment不同?
if (__x->_M_color == _S_red
&& __x->_M_parent->_M_parent == __x)
__x = __x->_M_right;
提前感谢您的评论和解释!
解决方案
这肯定是为了处理这个end()
案子——注意荒谬的自我祖父母检查和错误的运动方向。而且,毕竟,你不能递增 end()
. 颜色检查可能是(有时)避免比需要更多的内存获取的优化。
推荐阅读
- r - 为什么我的自定义函数无法正确转换经度和纬度?
- swift - 无法使用 AVSampleBufferAudioRenderer 播放 ACC 流
- go - gocb 访问包 gocb 中 results.go 中的内容 []byte
- python - Python 3.8 如何在 msg = get_message(service, user_id, msg_id) 命令之后读取行消息?
- python - 在 tkinter 中制作“粘贴”窗口的功能
- redis - 如何限制redis中的最大密钥大小
- python - 为什么 python append 方法不修改此字典中引用的列表?
- docker - 增加 Docker (Linux) 中的内存使用率
- firebase - Firebase 实时数据库,删除重复记录
- node.js - webpack-cli 未知参数:--output