【问题标题】:Can a map be used as a tree?地图可以用作树吗?
【发布时间】:2020-03-10 12:06:43
【问题描述】:

例如。 std::map<Item, std::vector<Item> >

考虑到 std/boost 中没有,这是否可以用作“快速而肮脏”的树结构(顶部有一些辅助函数,并且考虑到为 Item 实现了less)?

std::unordered_map 会更适合/更有用/有益吗?这需要哈希而不是比较 - 这可能更难实现。

我可以看到一个问题,找到父/所有者必须蛮力遍历整个地图(尽管如果需要,最好将其存储在单独的结构中)。

非常喜欢的另一件事是地图条目与带有空子列表的项目的双重含义。

【问题讨论】:

  • 只有当你明白树中的每个值都可能出现两次,一次作为值,一次作为键时。另一方面,使用std::shared_ptr...
  • std::vector 拥有它的数据,所以如果std::vector 中的每个项目也作为std::map 中的键出现,那么您将拥有多次相同的对象(恕我直言,这样浪费内存)。
  • @Fareanor 取决于我猜实际上是什么项目 - 有时由于复杂性或其他原因不需要 ptr 或 shared_ptr
  • 我想可以存储一个 std::optional 用于父查找 - 或者只是一个单独的结构。
  • 地图中的键是不可变的,但值不是。因此,如果您使用 vector<Item> 中的 Item 实例作为获取其他项目的键,则无法真正正确地执行此不变量(好吧,您可以用指针“作弊”)

标签: c++ tree c++17 stdmap


【解决方案1】:

地图可以当树吗?

情况正好相反:std::map 在内部使用树实现。所以树可以(被)用作地图。

map 和 unordered map 都不能用于实现一般的树结构。只有当您打算将树用作地图时,使用这些结构才会有用(因为它们是这种情况下需要的地图)

【讨论】:

  • 这里不想深入讨论,但是map中的树是二叉(搜索)树,是高度专业化的/cs技术树——和parent不完全一样——子关系树或只是一般的树(例如层次树)。
【解决方案2】:

你完全可以用这种方式表示一棵树;在特定情况下这是否是一个好主意完全取决于您需要快速执行哪些操作、您可以接受哪些慢速操作以及您的空间需求。

(当然,在许多应用程序中,上述所有问题的答案可能是“我不在乎”,在这种情况下,任何实现都可能没问题。)

【讨论】:

    猜你喜欢
    • 2015-07-08
    • 2018-03-01
    • 2013-10-02
    • 1970-01-01
    • 2011-10-17
    • 1970-01-01
    • 2014-11-05
    • 1970-01-01
    • 2018-10-30
    相关资源
    最近更新 更多