2013-06-17 8 views
5

私はstlの赤黒の木のコードを学びたいと思う。そして私は、ファイルのビットで_Rb_tree_incrementという名前の関数/ stl_tree.hビット/ stl_tree.hの_Rb_tree_incrementの定義は何ですか?

それは書いた:

143 _GLIBCXX_PURE _Rb_tree_node_base* 
144 _Rb_tree_increment(_Rb_tree_node_base* __x) throw(); 

をしかし、私は、この関数の定義を見つけることができません。誰でも助けることができますか?

ありがとうございました。

答えて

3

この定義は、使用している標準ライブラリによって異なります。 Differencコンパイラのベンダは、コンパイラに標準ライブラリのさまざまな実装を提供しています。あなたは非テンプレート関数を見つけたようです。これはいくつかのcppで定義する必要があり、libファイルにコンパイラと共に同梱されるので、コードに直接アクセスすることはできません。コンパイラには同梱されていないからです。

あなたのコンパイラは、例えば、propietaryコンパイラの場合マイクロソフトやボーランドから、それはあなたが得るすべてです。しかし、gccをお持ちの場合、gccはオープンソースであり、オンラインで標準ライブラリのgcc実装のソースを見つけることができます。

+1

OPは明らかにGCCとstdlibC++実装の出荷を使用しています。 –

+0

アルネ、あなたの答えがポイントになりました(「非テンプレート関数が見つかったようですが、これはいくつかのcppで定義されていて、libファイルのコンパイラと共に出荷されます」)。 :) –

2

それはあなたがおそらく持っていないライブラリのソースコード、になります。

あなたはGNUライブラリのヘッダを見ているように見えますので、hereは、ソースを探して開始するには良い場所でしょう。

+0

ありがとう、マイク。あなたのリンクは非常に便利です。 :) –

7

枚@マイクシーモアは私がgcc-4.8.1/libstdc++-v3/src/c++98/tree.cc内でより正確には、ライブラリのソースパスの定義を見つけ、言った:

static _Rb_tree_node_base* 
    local_Rb_tree_increment(_Rb_tree_node_base* __x) throw() 
    { 
    if (__x->_M_right != 0) 
     { 
     __x = __x->_M_right; 
     while (__x->_M_left != 0) 
      __x = __x->_M_left; 
     } 
    else 
     { 
     _Rb_tree_node_base* __y = __x->_M_parent; 
     while (__x == __y->_M_right) 
      { 
      __x = __y; 
      __y = __y->_M_parent; 
      } 
     if (__x->_M_right != __y) 
      __x = __y; 
     } 
    return __x; 
    } 

    _Rb_tree_node_base* 
    _Rb_tree_increment(_Rb_tree_node_base* __x) throw() 
    { 
    return local_Rb_tree_increment(__x); 
    } 

    const _Rb_tree_node_base* 
    _Rb_tree_increment(const _Rb_tree_node_base* __x) throw() 
    { 
    return local_Rb_tree_increment(const_cast<_Rb_tree_node_base*>(__x)); 
    } 
+0

ありがとう、マッサ。私はgccのソースコードをダウンロードする必要があると思う。 :) –

関連する問題