2013-06-17 7 views
5

Ich möchte Codes des rot-schwarzen Baumes in STL lernen. Und ich fand eine Funktion namens _Rb_tree_increment in der Datei Bit/stl_tree.hWas ist die Definition von _Rb_tree_increment in Bits/stl_tree.h?

es schreibt:

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

Aber ich kann nicht die Definition dieser Funktion finden. Jeder kann helfen?

Vielen Dank.

Antwort

3

Diese Definition hängt davon ab, welche Standardbibliothek Sie haben. Verschiedene Compilerhersteller bieten verschiedene Implementierungen der Standardbibliothek mit ihren Compilern an. Es scheint, dass Sie eine Nicht-Templat-Funktion gefunden haben. Das sollte in einigen cpp definiert werden und es wird mit dem Compiler in der lib-Datei geliefert werden, so dass Sie nicht direkt auf den Code zugreifen können, weil es nicht mit Ihrem Compiler geliefert wird - es ist einfach nicht notwendig.

Wenn Ihr Compiler ein proprietärer Compiler ist, z. von Microsoft oder Borland, das ist alles, was Sie bekommen werden. Wenn Sie jedoch einen gcc haben, haben Sie Glück: gcc ist Open Source und Sie können die Quellen für die gcc-Implementierung der Standardbibliothek online finden.

+1

OP offensichtlich die stdlibC++ mit GCC Implementierung Versand verwendet. –

+0

Vielen Dank, Arne, Ihre Antwort traf den Punkt ("Es scheint, Sie haben eine Nintemplate-Funktion gefunden. Das sollte in einigen cpp definiert werden und es wird mit dem Compiler in der lib-Datei geliefert werden"). :) –

2

Es wird im Quellcode der Bibliothek sein, die Sie wahrscheinlich nicht haben.

Es sieht so aus, als ob Sie die Header der GNU-Bibliothek betrachten, also wäre here ein guter Ort, um nach der Quelle zu suchen.

+0

Danke, Mike. Ihr Link ist sehr nützlich. :) –

7

Wie @ Mike Seymour sagte, ich die Definition auf der Bibliothek des Quellpfad gefunden, genauer gesagt innerhalb 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

Vielen Dank, Massa. Ich denke, ich muss den Quellcode von gcc herunterladen. :) –

Verwandte Themen