这个分层模型数据是不是有 stl 容器?
Posted
技术标签:
【中文标题】这个分层模型数据是不是有 stl 容器?【英文标题】:Is there an stl container for this hierarchical model data?这个分层模型数据是否有 stl 容器? 【发布时间】:2013-05-09 02:51:45 【问题描述】:对于独立于平台的模型层,我的分层数据(实际上是字符串)如下所示:
项目 A 子项 A 子项 B 子项 C 子子项 A 子子项 B 子项 D B 项 C 项现在,在每个“级别”(Item、SubItem、SubSubItem 等)内,项目需要按字母顺序排序。
似乎一个简单的解决方案是创建一个简单的类,该类具有排序的 std::Vector 或 std::MultiMap 以跟踪其子项,以及指向其父项的指针。 (和一个根项目)。我通常需要向前迭代每个项目的子项。
构建/排序后,我不需要添加或删除项目。通常是少量项目(数百个)。
这是用于大纲样式控件的支持数据的模型组织。
滚动一个简单的类很容易,但这是一种很常见的模式——不是已经有一个现成的具有这种行为的 STL 容器了吗?
【问题讨论】:
【参考方案1】:STL 本身没有任何内容,但您可能会发现这很有用:
tree.hh: an STL-like C++ tree class
它的 API 完全遵循 STL 容器,它应该可以满足您的需求。
事实上,我相信their example 正是您要问的(带字符串的树)。
【讨论】:
谢谢——这是一个优雅的课程。它在 GPLv2 / GPLv3 下获得许可。我正在开发商业软件。如果我不以任何方式修改代码,我是否需要分发任何源代码? 嗯,我根本不是专家,但听起来你应该是required to do just that。您也许可以改用property tree class from Boost。 @SMGreenfield - 我得出了同样的结论,这个类不适合商业应用。【参考方案2】:一个简单的解决方案:
您的键是std::vector<GUID>
,其中GUID
是唯一标识每个元素的某种类型(可能是GUID、指针或字符串)。元素的子元素只是将元素 std::vector<GUID>
作为“前缀”。
只要您的GUID
可以通过operator<
排序,std::vector
上的字典排序就会按照您请求的顺序排列。
map<std::vector<GUID>, Value>
可以是您的容器,也可以是您手动按.first
排序的std::vector< std::pair< GUID, Value > >
。
如果您的GUID
类型可以有一个“最后一个元素”,您可以通过查找x,y,z
的lower_bound
和x,y,z,last_guid
的upper_bound
来查找x,y,z
的每个子代。给它一个“最后一个元素”是不使用裸指针的一个优势。
【讨论】:
【参考方案3】:没有。不要刻薄,但这就是答案;参见例如Josuttis,或标准。您必须按照您建议的方式创建一个父/子指针的类,并使用向量或其他标准容器。
【讨论】:
【参考方案4】:您的问题的答案是否定的,STL 中没有树。你建议的模式很好。另见this question。
【讨论】:
以上是关于这个分层模型数据是不是有 stl 容器?的主要内容,如果未能解决你的问题,请参考以下文章