2012-07-08 26 views
9

Tôi hiểu rằng STL của tôi (đi kèm với g ++ 4.x.x) sử dụng cây đỏ đen để triển khai các vùng chứa như bản đồ. Có thể sử dụng trực tiếp cây đỏ đen bên trong của STL không. Nếu vậy, làm thế nào? Nếu không, tại sao không - tại sao STL không phơi bày cây đỏ-đen?Sử dụng thực thi nội bộ của cây đỏ-đỏ STL

Đáng ngạc nhiên, tôi không thể tìm thấy câu trả lời bằng google.

Chỉnh sửa: Tôi đang điều tra bằng cách sử dụng cây đỏ đen làm giải pháp cho lời gọi hàm tạo bổ sung của trình tạo phân bổ bổ sung. Xem this question. STL của tôi sử dụng cây đỏ đen để thực hiện bản đồ.

+0

"Tôi đang điều tra bằng cách sử dụng cây đỏ đen làm giải pháp cho cuộc gọi hàm tạo bổ sung cấp phát khi chèn". Một giải pháp thích hợp sẽ là sử dụng triển khai các vùng chứa tiêu chuẩn không có thuộc tính này. C++ 11 yêu cầu các trình cấp phát trạng thái, vì vậy bất kỳ thư viện chuẩn nào hỗ trợ đúng tính năng C++ 11 này sẽ có hành vi hợp lý hơn (mặc dù nó vẫn sẽ xây dựng các cá thể cấp phát khác nhau, nó sẽ chỉ làm như vậy từ đối tượng cấp phát ban đầu). –

+0

@Prasoon - Nó sẽ không giúp bạn ở đây, bởi vì nó là thực hiện cây cơ bản mà các nhà xây dựng gọi anyway. Thử một trình biên dịch mới hơn gcc 4.1 sẽ là một tùy chọn (câu hỏi trước [Bộ cấp phát bộ nhớ tùy chỉnh cho bản đồ STL] (http: // stackoverflow.com/questions/11373796/custom-memory-allocator-cho-stl-map)) –

Trả lời

7

Thực ra - câu trả lời rất đơn giản và độc lập với phiên bản gcc của bạn. Bạn có thể tải xuống mã nguồn stl từ sgi's website và xem việc triển khai và sử dụng cho chính mình.

Ví dụ: trong phiên bản 3.2, bạn có thể thấy triển khai cây đỏ-đen trong tệp stl_tree.h và ví dụ về việc sử dụng nó trong stl_set.h.

Lưu ý rằng vì các lớp stl là các lớp mẫu, nên việc triển khai thực sự nằm trong các tệp tiêu đề.

2

Hầu hết các triển khai STL của setmap là những cây đen đỏ mà tôi tin, mặc dù không có gì ngăn người khác thực hiện chúng bằng cấu trúc dữ liệu khác - nếu tôi nhớ chính xác thì tiêu chuẩn C++ không yêu cầu thực thi RB.

STL không phơi bày nó như có thể vi phạm nguyên tắc OOP .. phơi bày cấu trúc dữ liệu cơ bản có thể dẫn đến hành vi không mong muốn nếu người khác sử dụng thư viện của bạn. Đặc biệt, đối với setmap, bạn chỉ được phép truy cập vào các phương thức phù hợp với cấu trúc dữ liệu setmap.

Điều đó đang được nói, không có cách nào (theo kiến ​​thức của tôi) trực tiếp sử dụng cây màu đỏ nằm bên dưới .. nó sẽ phụ thuộc rất nhiều vào cách bạn muốn sử dụng nó. Việc triển khai cây đỏ đen của bạn rất có thể là đặt cược tốt nhất của bạn hoặc kiểm tra thư viện của bên thứ ba của chúng tôi (có thể là Boost?)

3

Bạn thậm chí không được đảm bảo rằng cấu trúc dữ liệu được sử dụng sẽ be a red- cây đen (ví dụ, nó được thực hiện ít nhất một lần như một cây AVL, và một cái gì đó giống như B-, B * hoặc B + cây có thể sẽ được tốt là tốt).

Như vậy, cách duy nhất để nhận được nội bộ là xem xét triển khai cụ thể và tận dụng những thứ không (ít nhất là cố gắng) hiển thị công khai.

Vì lý do: tôi nghĩ chủ yếu vì đó là nỗ lực trừu tượng, không hiển thị tất cả chi tiết triển khai.

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