Я думаю, що є кілька причин, чому немає дерев STL. В основному Дерева - це форма рекурсивної структури даних, яка, як і контейнер (список, вектор, набір), має дуже різну тонку структуру, що робить правильний вибір складним. Їх також дуже легко сконструювати в базовій формі за допомогою STL.
Кінцеве вкорінене дерево можна розглядати як контейнер, який має значення або корисне навантаження, скажімо, екземпляр класу A і, можливо, порожня колекція укорінених (під) дерев; дерева з порожньою колекцією підкреслив вважаються листям.
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
{};
Треба трохи подумати над дизайном ітератора і т. Д., Які операції з продуктом та спільним продуктом дозволяють визначити та бути ефективними між деревами - і оригінальний STL повинен бути добре записаний - так, щоб порожній набір, вектор або контейнер списку були дійсно порожній від будь-якої корисної навантаження у випадку за замовчуванням.
Дерева відіграють найважливішу роль у багатьох математичних структурах (див. Класичні праці Бутчера, Гроссмана та Ларсена; також документи Коннеса та Крімера для прикладів їх приєднання та способів їх перерахування). Неправильно думати, що їхня роль - це просто полегшити певні інші операції. Швидше вони полегшують виконання цих завдань через їх основну роль як структури даних.
Однак, окрім дерев, є ще й «ко-дерева»; дерева насамперед мають властивість, що якщо ви видалите корінь, ви видалите все.
Розглянемо ітератори на дереві, ймовірно, вони були б реалізовані як простий стек ітераторів, до вузла та до його батьківського, ... аж до кореня.
template<class TREE>
struct node_iterator : std::stack<TREE::iterator>{
operator*() {return *back();}
...};
Однак ти можеш мати скільки завгодно; разом вони утворюють "дерево", але там, де всі стрілки протікають у напрямку до кореня, це ко-дерево може бути переведене через ітераторів до тривіального ітератора та кореня; однак не можна переміщуватися поперек або вниз (інші ітератори йому не відомі), а також ансамбль ітераторів не можна видалити, за винятком відстеження всіх екземплярів.
Дерева неймовірно корисні, вони мають багато структури, це робить серйозним завданням отримати остаточно правильний підхід. На мою думку, саме тому вони не реалізовані в STL. Більше того, в минулому я бачив, як люди стають релігійними і знаходять уявлення про тип контейнера, що містить екземпляри свого типу, що викликає виклик - але вони повинні зіткнутися з цим - ось що представляє тип дерева - це вузол, що містить можливо порожня колекція (менших) дерев. Поточна мова дозволяє це без проблем, якщо конструктор за замовчуванням container<B>
не виділяє місця в купі (або деінде) для і B
т.д.
Я, наприклад, був би радий, якби це в хорошій формі знайшло свій шлях до стандарту.