7
votes

Existe-t-il un conteneur STL pour ces données de modèle hiérarchique?

Pour une couche de modèle indépendante de la plate-forme, j'ai des données hiérarchiques (chaînes, en fait) qui ressemblent à ceci:

  • article A
    • subitem a
    • subitem b
    • subitem c
      • Subsubitem A
      • Subsubitem B
      • subitem d
      • item b
      • item c

        Maintenant, dans chaque "niveau" (élément, sous-couche, soutième, etc.) Les éléments doivent être triés par ordre alphabétique.

        semble une solution simple serait de créer une classe simple avec une STD triée :: Vector ou STD :: Multimap pour suivre ses enfants et un pointeur à son parent. (et un élément racine). Je devrais généralement parcourir les enfants de chaque article dans une direction avancée.

        Après construction / tri, je n'ai pas besoin d'ajouter ou de supprimer des éléments. Généralement petit nombre d'articles (centaines).

        Ceci est pour l'organisation modèle des données de support d'un contrôle de style de contour.

        Rouler une classe simple serait facile, mais c'est un tel modèle commun - n'est-ce pas déjà un conteneur STL prêt à l'emploi avec ce comportement?


0 commentaires

4 Réponses :


1
votes

non. Ne veut pas dire être Curt, mais c'est la réponse; voir par exemple Josuttis ou la norme. Vous devrez créer une classe quels pointeurs parent / enfant le long des lignes que vous avez suggéré et utilisez un vecteur ou un autre conteneur standard de ceux-ci.


0 commentaires

5
votes

rien dans la STL elle-même, mais vous pourriez trouver cela utile:

arbre.hh: une classe d'arborescence C ++ de type stl

Son API suit exactement les conteneurs STL, et il devrait faire ce que vous recherchez.

Je crois leur exemple est exactement ce que vous demandez (un arbre avec des chaînes), en fait.


3 commentaires

Merci - c'est une classe élégante. Il est sous licence sous GPLV2 / GPLV3. Je développe des logiciels commerciaux. Si je ne modifie pas le code de quelque manière que ce soit, suis-je nécessaire de distribuer un code source?


Hmmm Je ne suis pas un expert du tout, mais ça sonne comme si vous seriez faire juste que . Vous pourrez peut-être utiliser le Classe d'arborescence de la propriété de Boost à la place.


@Smgreenfield - Je suis entré à la même conclusion que cette classe ne convient pas aux applications commerciales.




2
votes

une solution simple:

Vos clés sont std :: vecteur , où le type est un type (peut-être un guide ou un pointeur, ou une chaîne) qui identifie de manière unique chaque élément. Les enfants d'un élément ont simplement des éléments std :: vecteur comme "préfixe".

Tant que votre GUID est tritable via opérateur << / code>, tri lexographique sur le std :: vecteur obtiendra les choses dans l'ordre demandé.

A mappe , valeur> pourrait être votre conteneur, ou un std :: vecteur > que vous triez par .first manuellement.

Si votre type GUID peut avoir un "dernier élément", vous pouvez trouver tous les enfants de {x, y, z} en trouvant inférieur_bound de {x, y, z} et upper_bound de {x, y, z, last_guid} . Lui donner un "dernier élément" est un avantage à ne pas utiliser de pointeur nue.


0 commentaires