【问题标题】: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 容器了吗?

【问题讨论】:

    标签: c++ sorting stl containers


    【解决方案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。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-03-13
          • 1970-01-01
          • 1970-01-01
          • 2020-02-01
          • 1970-01-01
          • 2018-10-03
          • 2016-06-07
          • 2021-11-15
          相关资源
          最近更新 更多