这个分层模型数据是否有一个stl容器?

时间:2013-05-09 02:51:46

标签: c++ sorting stl containers

对于独立于平台的模型层,我有分层数据(实际上是字符串),如下所示:

  • 项目A.
    • SubItem A
    • SubItem B
    • SubItem C.
      • SubSubItem A
      • SubSubItem B
    • SubItem D
  • 项目B
  • 项目C

现在,在每个“级别”(Item,SubItem,SubSubItem等)中,项目需要按字母顺序排序。

似乎一个简单的解决方案是创建一个带有排序的std :: Vector或std :: MultiMap的简单类来跟踪它的Children,以及指向它的Parent的指针。 (和一个根项目)。我需要一般向前遍历每个项目的孩子。

构建/排序后,我不需要添加或删除项目。通常少量的物品(数百)。

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

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

4 个答案:

答案 0 :(得分:5)

STL本身没什么,但你可能会觉得这很有用:

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

它的API完全遵循STL容器,它应该做你想要的。

我相信their example正是你所询问的(带有字符串的树),事实上。

答案 1 :(得分:2)

一个简单的解决方案:

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

只要GUID可以通过operator<进行排序,std::vector上的词法排序就会按照您要求的顺序排序。

map<std::vector<GUID>, Value>可以是您的容器,也可以是您std::vector< std::pair< GUID, Value > >手动排序的.first

如果您的GUID类型可以包含“最后一个元素”,则可以通过查找{x,y,z}lower_bound的{​​{1}}找到{x,y,z}的每个孩子。 upper_bound。给它一个“最后一个元素”是不使用裸指针的一个优点。

答案 2 :(得分:1)

没有。不要吝啬,但这就是答案;见例如Josuttis,或标准。您将必须创建一个类,其中包含您建议的行的父/子指针,并使用向量或其他标准容器。

答案 3 :(得分:1)

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