Tôi nghĩ rằng có một số lý do tại sao không có cây STL. Cây chủ yếu là một dạng cấu trúc dữ liệu đệ quy, giống như một thùng chứa (danh sách, vectơ, tập hợp), có cấu trúc tốt rất khác nhau khiến cho các lựa chọn chính xác trở nên khó khăn. Chúng cũng rất dễ dàng để xây dựng ở dạng cơ bản bằng cách sử dụng STL.
Một cây gốc hữu hạn có thể được coi là một thùng chứa có giá trị hoặc tải trọng, giả sử là một thể hiện của lớp A và, một bộ sưu tập các cây gốc (phụ) có thể trống; cây với bộ sưu tập trống của cây con được coi là lá.
template<class A>
struct unordered_tree : std::set<unordered_tree>, A
{};
template<class A>
struct b_tree : std::vector<b_tree>, A
{};
template<class A>
struct planar_tree : std::list<planar_tree>, A
{};
Người ta phải suy nghĩ một chút về thiết kế lặp, v.v. và hoạt động của sản phẩm và đồng sản phẩm nào cho phép xác định và hiệu quả giữa các cây - và STL ban đầu phải được viết tốt - sao cho bộ chứa, vectơ hoặc danh sách trống thực sự trống rỗng của bất kỳ tải trọng nào trong trường hợp mặc định.
Cây xanh đóng một vai trò thiết yếu trong nhiều cấu trúc toán học (xem các bài báo cổ điển của Butcher, Grossman và Larsen; cũng là các bài báo của Connes và Kriemer để biết ví dụ về chúng có thể được tham gia và cách chúng được sử dụng để liệt kê). Thật không đúng khi nghĩ rằng vai trò của họ chỉ đơn giản là tạo điều kiện cho một số hoạt động khác. Thay vào đó, họ tạo điều kiện cho các nhiệm vụ đó vì vai trò cơ bản của chúng là cấu trúc dữ liệu.
Tuy nhiên, ngoài cây còn có "đồng cây"; các cây ở trên đều có thuộc tính mà nếu bạn xóa gốc bạn sẽ xóa mọi thứ.
Hãy xem xét các trình vòng lặp trên cây, có lẽ chúng sẽ được nhận ra như một chồng các trình vòng lặp đơn giản, đến một nút và với cha mẹ của nó, ... cho đến tận gốc.
template<class TREE>
struct node_iterator : std::stack<TREE::iterator>{
operator*() {return *back();}
...};
Tuy nhiên, bạn có thể có bao nhiêu tùy thích; gọi chung chúng tạo thành một "cây" nhưng trong đó tất cả các mũi tên chảy theo hướng về phía gốc, cây đồng này có thể được lặp qua các vòng lặp hướng tới trình lặp và gốc không quan trọng; tuy nhiên nó không thể được điều hướng qua hoặc xuống (các trình vòng lặp khác không được biết đến) cũng như không thể xóa toàn bộ các trình vòng lặp trừ khi theo dõi tất cả các trường hợp.
Cây rất hữu ích, chúng có rất nhiều cấu trúc, điều này làm cho nó trở thành một thách thức nghiêm trọng để có được cách tiếp cận chính xác. Theo quan điểm của tôi đây là lý do tại sao chúng không được thực hiện trong STL. Hơn nữa, trong quá khứ, tôi đã thấy mọi người tôn giáo và tìm thấy ý tưởng về một loại container chứa các trường hợp thuộc loại riêng của nó đầy thách thức - nhưng họ phải đối mặt với nó - đó là những gì một loại cây đại diện - đó là một nút chứa một có thể bộ sưu tập trống của cây (nhỏ hơn). Ngôn ngữ hiện tại cho phép nó mà không có thách thức khi cung cấp hàm tạo mặc định cho việc container<B>
không phân bổ không gian trên heap (hoặc bất kỳ nơi nào khác) cho một B
, v.v.
Tôi cho một người sẽ hài lòng nếu điều này đã làm, trong một hình thức tốt, tìm đường đến tiêu chuẩn.