«Я хочу сохранить иерархию объектов в виде дерева»
C ++ 11 пришел и ушел, и они все еще не видели необходимости предоставлять std::tree
, хотя идея все же пришла (см. здесь ). Возможно, причина, по которой они не добавили это, состоит в том, что легко построить свой собственный поверх существующих контейнеров. Например ...
template< typename T >
struct tree_node
{
T t;
std::vector<tree_node> children;
};
Простой обход будет использовать рекурсию ...
template< typename T >
void tree_node<T>::walk_depth_first() const
{
cout<<t;
for ( auto & n: children ) n.walk_depth_first();
}
Если вы хотите поддерживать иерархию и , которую вы хотите, чтобы она работала с алгоритмами STL , то все может быть сложно. Вы можете создать свои собственные итераторы и достичь некоторой совместимости, однако многие алгоритмы просто не имеют никакого смысла для иерархии (например, всего, что изменяет порядок диапазона). Даже определение диапазона в иерархии может быть грязным делом.