2013-06-17 20 views
5

Kırmızı-siyah ağacın kodlarını stl'de öğrenmek istiyorum. Ve ben bir dosya bit _Rb_tree_increment adlı fonksiyonu/stl_tree.hBit/stl_tree.h dosyasındaki _Rb_tree_increment tanımı nedir?

o yazıyor bulundu:

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

Ama bu işlevin tanımını bulamıyorum. Herkes yardım edebilir mi?

Çok teşekkür ederim.

cevap

3

Bu tanım, sahip olduğunuz standart kitaplığa bağlıdır. Differenc derleyici satıcıları, standart kütüphanenin derleyicileri ile farklı uygulamaları sağlar. Görünmez bir işlev bulmuşsunuz gibi görünüyor. Bu, bazı cpp'de tanımlanmalı ve lib dosyasındaki derleyici ile gönderilecektir, bu yüzden kodunuza doğrudan erişemezsiniz, çünkü derleyicinizle birlikte gönderilmez - sadece gerekli değildir.

Derleyiciniz bir müstakil derleyici ise, örn. Microsoft veya Borland'dan, alacağın tek şey bu. Ancak bir gcc'iniz varsa, şansınız çok açık: gcc açık kaynak kodlu ve standart kütüphanenin gcc uygulamasının kaynaklarını online olarak bulabilirsiniz.

+1

OP besbelli GCC ile stdlibC++ uygulama nakliye kullanıyor. –

+0

Harika teşekkürler Arne, cevabınız şu noktayı işaret etti ("Görünüşte bir fonksiyon bulduğunuz görülüyor. Bu, bazı cpp'de tanımlanmalı ve lib dosyasında derleyici ile gönderilecektir"). :) –

2

Kitaplıktaki, muhtemelen sahip olmadığınız bir kaynak kodunda bulunur.

GNU kütüphanesinin başlıklarına bakıyorsunuz gibi görünüyor, bu yüzden here kaynağı aramaya başlamak için iyi bir yer olurdu.

+0

Teşekkürler, Mike. Bağlantınız çok faydalı. :) –

7

gibi @ Mike Seymour ben gcc-4.8.1/libstdc++-v3/src/c++98/tree.cc içeride daha doğrusu kitaplığının kaynak yoluna tanımını buldum, şunları söyledi:

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

Çok teşekkürler, Massa. Sanırım gcc'nin kaynak kodunu indirmem gerekiyor. :) –