Các câu trả lời trước chỉ giải quyết các lựa chọn thay thế cây và màu đen đỏ có lẽ chỉ còn lại vì lý do lịch sử.
Tại sao không phải là bảng băm?
Một loại chỉ yêu cầu <
toán tử (so sánh) được sử dụng làm khóa trong cây. Tuy nhiên, các bảng băm yêu cầu mỗi loại khóa có một hash
hàm được xác định. Giữ các yêu cầu loại ở mức tối thiểu là rất quan trọng đối với lập trình chung để bạn có thể sử dụng nó với nhiều loại và thuật toán khác nhau.
Thiết kế một bảng băm tốt đòi hỏi kiến thức sâu sắc về bối cảnh mà nó sẽ được sử dụng. Nó nên sử dụng địa chỉ mở, hoặc chuỗi liên kết? Những mức tải nào nên chấp nhận trước khi thay đổi kích thước? Nó có nên sử dụng một hàm băm đắt tiền để tránh va chạm, hay một thứ thô và nhanh?
Vì STL không thể lường trước đâu là lựa chọn tốt nhất cho ứng dụng của bạn, nên mặc định cần phải linh hoạt hơn. Cây "chỉ hoạt động" và quy mô độc đáo.
(C ++ 11 đã thêm các bảng băm với unordered_map
. Bạn có thể thấy từ tài liệu mà nó yêu cầu thiết lập các chính sách để định cấu hình nhiều tùy chọn này.)
Còn những cây khác thì sao?
Cây Đỏ Đen cung cấp tra cứu nhanh và tự cân bằng, không giống như các BST. Một người dùng khác đã chỉ ra những ưu điểm của nó so với cây AVL tự cân bằng.
Alexander Stepanov (Người tạo ra STL) nói rằng anh ta sẽ sử dụng Cây B * thay vì cây Đỏ-Đen nếu anh ta viết std::map
lại, vì nó thân thiện hơn với bộ nhớ đệm hiện đại.
Một trong những thay đổi lớn nhất kể từ đó là sự phát triển của cache. Việc bỏ lỡ bộ nhớ cache rất tốn kém, vì vậy địa phương tham chiếu quan trọng hơn nhiều bây giờ. Các cấu trúc dữ liệu dựa trên nút, có địa phương tham chiếu thấp, có ý nghĩa ít hơn nhiều. Nếu tôi thiết kế STL ngày hôm nay, tôi sẽ có một bộ container khác. Ví dụ, B * -tree trong bộ nhớ là lựa chọn tốt hơn nhiều so với cây đỏ đen để thực hiện một thùng chứa kết hợp. - Alexander Stepanov
Bản đồ có nên sử dụng cây xanh?
Một triển khai bản đồ có thể khác sẽ là một vectơ được sắp xếp (sắp xếp chèn) và tìm kiếm nhị phân. Điều này sẽ hoạt động tốt đối với các container không được sửa đổi thường xuyên nhưng được truy vấn thường xuyên. Tôi thường làm điều này trong C như qsort
và bsearch
được xây dựng trong.
Tôi thậm chí có cần sử dụng bản đồ?
Cân nhắc bộ nhớ cache có nghĩa là hiếm khi có ý nghĩa để sử dụng std::list
hoặc std::deque
hơn std:vector
ngay cả đối với những tình huống chúng tôi được dạy ở trường (chẳng hạn như xóa một yếu tố khỏi giữa danh sách). Áp dụng lý do tương tự, sử dụng vòng lặp for để tìm kiếm tuyến tính một danh sách thường hiệu quả và sạch sẽ hơn so với việc xây dựng bản đồ cho một vài tra cứu.
Tất nhiên việc chọn một container có thể đọc được thường quan trọng hơn hiệu suất.