对于独立于平台的模型层,我有分层数据(实际上是字符串),如下所示:
现在,在每个“级别”(Item,SubItem,SubSubItem等)中,项目需要按字母顺序排序。
似乎一个简单的解决方案是创建一个带有排序的std :: Vector或std :: MultiMap的简单类来跟踪它的Children,以及指向它的Parent的指针。 (和一个根项目)。我需要一般向前遍历每个项目的孩子。
构建/排序后,我不需要添加或删除项目。通常少量的物品(数百)。
这是用于大纲样式控件的后备数据的模型组织。
滚动一个简单的类很容易,但这是一个常见的模式 - 是不是已经有一个现成的STL容器有这种行为?
答案 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。