2013-05-09 59 views
6

对于平台无关模型层,我看起来像这样的分层数据(字符串,实际上):这个层次模型数据是否有一个stl容器?

  • 项目A
    • 子项目一
    • 子项目乙
    • 子项目Ç
      • SubSubItem A
      • SubSubItem B
    • 子项目d
  • 项B
  • 项C

现在,每个 “水平”(项目,子项,SubSubItem等)内的项目需要字母顺序排序。

似乎一个简单的解决方案是创建一个简单的类,使用排序后的std :: Vector或std :: MultiMap来跟踪它的子元素,以及一个指向其Parent的指针。 (和一个根项目)。我需要通常在前进方向上遍历每个项目的孩子。

施工/分拣后,我不需要添加或删除项目。通常少量的项目(数百)。

这是用于大纲样式控件的后台数据的模型组织。

滚动一个简单的类很容易,但是这是一个很常见的模式 - 是不是已经有一个现成的STL容器了?

回答

5

在STL本身没什么,但你可能会发现这个有用:

tree.hh: an STL-like C++ tree class

它的API如下STL容器准确,它应该做你要找的东西。

我相信their example正是你问的(一个带有字符串的树),实际上。

+0

谢谢 - 这是一个优雅的班级。它在GPLv2/GPLv3下获得许可。我正在开发商业软件。如果我不以任何方式修改代码,我是否需要分发任何源代码? – SMGreenfield 2013-05-09 04:30:17

+0

嗯,我不是一个专家,但它听起来像[你需要这样做](https://www.gnu.org/licenses/gpl-faq.html#GPLInProprietarySystem)。您也许可以使用[Boost中的属性树类](http://www.boost.org/doc/libs/1_53_0/doc/html/property_tree.html)。 – Corey 2013-05-09 05:13:28

+0

@SMGreenfield - 我得出同样的结论,这个班不适合商业应用。 – MarkB 2013-05-11 12:22:15

1

不,不是故意的,但那是答案;见例如Josuttis,或标准。您必须根据您建议的行创建一个父/子指针类,并使用这些类的向量或其他标准容器。

1

你的问题的答案是否定的,在STL中没有树。你建议的模式很好。另见this question

2

一个简单的解决方案:

你的键是std::vector<GUID>,其中GUID是某种类型的(可能是GUID,或者指针,或字符串)唯一标识每个元素。一个元素的子元素只需要将这个元素std::vector<GUID>作为“前缀”。

只要您的GUID可通过operator<排序,std::vector上的词典排序将按照您的要求进行排列。

A map<std::vector<GUID>, Value>可能是您的容器,或者是您手动排序.firststd::vector< std::pair< GUID, Value > >

如果您GUID类型可以有一个“最后一个元素”,您可以通过找到{x,y,z}lower_bound{x,y,z,last_guid}upper_bound找到{x,y,z}每一个孩子。给它一个“最后一个元素”是不使用裸指针的好处。

相关问题