2013-06-17 12 views
5

Chcę nauczyć się kodów drzewa czerwono-czarnego w STL. I znalazłem funkcję o nazwie _Rb_tree_increment bitów w pliku/stl_tree.hJaka jest definicja _Rb_tree_increment w bits/stl_tree.h?

to pisze:

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

Ale nie mogę znaleźć definicję tej funkcji. Ktoś może pomóc?

Dziękuję bardzo.

Odpowiedz

3

Ta definicja zależy od posiadanej biblioteki standardowej. Dostawcy kompilatorów różnicowych udostępniają różne implementacje standardowej biblioteki swoim kompilatorom. Wygląda na to, że znalazłeś funkcję niedozwoloną. To powinno być zdefiniowane w niektórych cpp i będzie dostarczane z kompilatorem w pliku lib, więc nie będziesz mógł uzyskać dostępu bezpośrednio do kodu, ponieważ nie będzie on dostarczany z twoim kompilatorem - po prostu nie jest to konieczne.

Jeśli Twój kompilator jest firmowym kompilatorem, np. z Microsoft lub Borland, to wszystko, co dostaniesz. Jeśli masz jednak gcc, masz szczęście: gcc jest open source i możesz znaleźć źródła dla implementacji gcc standardowej biblioteki online.

+1

OP jest oczywiście używając stdlibC++ wysyłkę realizacji z GCC. –

+0

Wielkie dzięki, Arne, twoja odpowiedź trafia w sedno ("Wygląda na to, że znalazłeś funkcję typu" niegodziwca ", która powinna być zdefiniowana w niektórych cpp i zostanie dostarczona z kompilatorem w pliku lib"). :) –

2

Będzie to w kodzie źródłowym biblioteki, którego prawdopodobnie nie masz.

Wygląda na to, że patrzysz na nagłówki biblioteki GNU, więc here będzie dobrym miejscem do rozpoczęcia wyszukiwania źródła.

+0

Dzięki, Mike. Twój link jest bardzo przydatny. :) –

7

Jak @Mike Seymour powiedział, znalazłem definicję źródła ścieżki biblioteki, a dokładniej wewnątrz 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

Wielkie dzięki, Massa. Myślę, że muszę pobrać kod źródłowy gcc. :) –

Powiązane problemy