2013-06-17 14 views
5

Voglio imparare i codici dell'albero rosso-nero in stl. E ho trovato una funzione denominata _Rb_tree_increment nei bit dei file/stl_tree.hQual è la definizione di _Rb_tree_increment in bits/stl_tree.h?

scrive:

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

Ma non riesco a trovare la definizione di questa funzione. Chiunque può aiutare?

Grazie mille.

risposta

3

Questa definizione dipende dalla libreria standard in uso. I produttori di compilatori di Differenc forniscono diverse implementazioni della libreria standard con i loro compilatori. Sembra che tu abbia trovato una funzione nontemplate. Questo dovrebbe essere definito in alcuni cpp e verrà spedito con il compilatore nel file lib, quindi non puoi accedere direttamente al codice, perché non verrà spedito con il tuo compilatore - semplicemente non è necessario.

Se il compilatore è un compilatore propietario, ad es. da Microsoft o Borland, è tutto ciò che otterrai. Tuttavia, se hai un gcc, sei fortunato: gcc è open source e puoi trovare i sorgenti per l'implementazione gcc della libreria standard online.

+1

OP è, ovviamente, utilizzando il trasporto di implementazione stdlibC++ con GCC. –

+0

Grazie mille, Arne, la tua risposta ha colpito il punto ("Sembra che tu abbia trovato una funzione nontemplate, che dovrebbe essere definita in alcuni cpp e che verrà spedita con il compilatore nel file lib"). :) –

2

Sarà nel codice sorgente della libreria, che probabilmente non hai.

Sembra che tu stia guardando le intestazioni della libreria GNU, quindi here sarebbe un buon punto di partenza per cercare la fonte.

+0

Grazie, Mike. Il tuo link è molto utile :) –

7

Come @ Mike Seymour Detto questo, ho trovato la definizione sul percorso di origine della biblioteca, più precisamente all'interno 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

Grazie mille, Massa. Penso di aver bisogno di scaricare il codice sorgente di gcc. :) –

Problemi correlati