这个分层模型数据是不是有 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,zlower_boundx,y,z,last_guidupper_bound 来查找x,y,z 的每个子代。给它一个“最后一个元素”是不使用裸指针的一个优势。

【讨论】:

【参考方案3】:

没有。不要刻薄,但这就是答案;参见例如Josuttis,或标准。您必须按照您建议的方式创建一个父/子指针的类,并使用向量或其他标准容器。

【讨论】:

【参考方案4】:

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

【讨论】:

以上是关于这个分层模型数据是不是有 stl 容器?的主要内容,如果未能解决你的问题,请参考以下文章

( )不是对网络模型进行分层的目标。

( )不是对网络模型进行分层的目标。

分层数据模型的替代方案

Supermap关于分层单体化的操作过程说明

说一说数据仓库分层模型

HTTP笔记_02_HTTP的网络分层模型