【STL】【RBTreeはなぜ3つのパラメータ(T,Reference,Pointer)を持っているのか】

3272 ワード

————————————————————————————————————————————【前列求star】https://github.com/whq703/tinySTL完了状況:1、空間割り当て2、vector 3、list 4、RBtree 5、setはすでに基本的な機能(findinserteraseなど)をすべて実現し、その他の拡張機能はこれらの基本的な機能を通じて完成することができ、いくつかのテスト例を提供した.
————————————————————————————————————————————————————《stlソースコード剖析》とgithubを見るhttps://github.com/electronicarts/EASTL手探りでやっとできたiteratorのいくつかの問題はこのreadmeに書いてください.
struct node_base
{
    node* left;
    ……
};
template< typename T>
struct node:public node_base
{
    T value;
};

template< typename T,typename Reference,typename Pointer>
struct nodeIterator
{
    typename T value_type;
    typename Reference reference;
    typename Pointer pointer;
    typename node< T> node_type;

    node_type* p;

    nodeIterator(node_type* _p):p(_p){}

    reference operator*(){……}
    pointer operator->(){……}
};

template< typename Key, typename Value, typename KeyOfValue, typename Compare, typename Alloc = alloc>
class rb_tree
{
public:
            typedef Key key_type;
            typedef Value value_type;
            typedef value_type* pointer;
            typedef value_type& reference;
            typedef const value_type* const_pointer;
            typedef const value_type& const_reference;

            typedef rbtree_iterator< value_type,pointer,reference > iterator;
            typedef rbtree_iterator< value_type,const_pointer,const_reference > const_iterator;
 };

最初はなぜiteratorのtemplateパラメータが3つ(T,Reference,Pointer)あるのか分からなかったので、自業自得で1つ持っていたので、変換できない状況が発生しました.何が原因ですか.パラメータTが1つしかないのでtypedef rbtree_iterator< value_type> iterator; typedef rbtree_iterator< const value_type> const_iterator;
そこでiteratorとconst_iteratorのクラス:node*p;node< const T >* p;
これは気まずいです.例えば、iterator itを与えて、どのようにconstになりますか.iterator? it.pはnode*タイプで、const_としては使用できませんiteratorは関数のパラメータを構築します.必要なパラメータタイプはnode*です.
ここでは3つのパラメータが必要ですiteratorでもconst_でもiterator、そのpのタイプはすべてnode*で互いにパラメータとして別の1つを構築することができます!両者の違いはreferenceとpointerのみであるため,3つのパラメータ(T,Reference,Pointer)が必要である.