C++ map一些内部实现

1,map的end()是可以访问的,并不会coredump,它实际上是map的root指针
2,list.size()操作是一个O(n)复杂度的。
 
std::map通过iterator拿first和second
std::map的iterator包含了一个指针_M_node,_M_node是一个_Rb_tree_node_base指针,_Rb_tree_node_base的结构:
struct _Rb_tree_node_base {
    _Rb_tree_color  _M_color;
    _Base_ptr       _M_parent;
    _Base_ptr       _M_left;
    _Base_ptr       _M_right;
};
_M_node的真实结构是一个_Rb_tree_node_base再接一个pair<Key, Value>。所以拿到iterator->_M_node之后往后走32个字节,就是key和value组成的pair对。
(gdb) p it
$38 = {_M_node = 0xbac5c630}
(gdb) p it._M_node
$39 = (std::_Rb_tree_iterator<std::pair<unsigned int const, apsara::pangu::Future<int>*> >::_Base_ptr) 0xbac5c630
posted @ 2019-07-16 22:40  CobbLiu  阅读(1455)  评论(0编辑  收藏  举报