2013-06-17 39 views
5

Tôi muốn tìm hiểu mã của cây đỏ đen trong stl. Và tôi tìm thấy một hàm có tên _Rb_tree_increment trong các bit tập tin/stl_tree.hĐịnh nghĩa của _Rb_tree_increment bằng bit/stl_tree.h là gì?

nó viết:

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

Nhưng tôi không thể tìm thấy định nghĩa của chức năng này. Bất cứ ai cũng có thể giúp đỡ?

Cảm ơn bạn rất nhiều.

Trả lời

3

Định nghĩa đó phụ thuộc vào thư viện chuẩn nào bạn có. Các nhà cung cấp trình biên dịch khác nhau cung cấp các triển khai khác nhau của thư viện chuẩn với các trình biên dịch của chúng. Có vẻ như bạn đã tìm thấy một hàm nontemplate. Điều đó nên được định nghĩa trong một số cpp và nó sẽ được gửi kèm với trình biên dịch trong tệp lib, vì vậy bạn không thể truy cập trực tiếp mã, bởi vì nó sẽ không được gửi kèm với trình biên dịch của bạn - đơn giản là không cần thiết.

Nếu trình biên dịch của bạn là trình biên dịch propietary, ví dụ: từ Microsoft hoặc Borland, đó là tất cả những gì bạn sẽ nhận được. Tuy nhiên, nếu bạn có gcc, bạn đã may mắn: gcc là mã nguồn mở và bạn có thể tìm thấy nguồn cho việc triển khai gcc của thư viện chuẩn trực tuyến.

+1

OP được rõ ràng bằng cách sử dụng stdlibC++ vận chuyển thực hiện với GCC. –

+0

Xin cảm ơn, Arne, câu trả lời của bạn đã đạt đến điểm ("Có vẻ như bạn đã tìm thấy một hàm nontemplate. Điều đó nên được định nghĩa trong một số cpp và nó sẽ được gửi kèm với trình biên dịch trong tệp lib"). :) –

2

Mã sẽ nằm trong mã nguồn của thư viện mà bạn có thể không có.

Dường như bạn đang xem tiêu đề của thư viện GNU, vì vậy here sẽ là một nơi tốt để bắt đầu tìm kiếm nguồn.

+0

Cảm ơn, Mike. Liên kết của bạn rất hữu ích. :) –

7

Giống như @ Mike Seymour nói, tôi thấy các định nghĩa trên con đường nguồn của thư viện, chính xác hơn trong 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

Cảm ơn rất nhiều, Massa. Tôi nghĩ tôi cần tải xuống mã nguồn của gcc. :) –

Các vấn đề liên quan