【问题标题】:Tree kind implementation via map通过地图实现树种
【发布时间】:2018-02-05 18:19:38
【问题描述】:

我不想通过地图容器编写 Tree 类实现。

输入

> S Hugo Laura
> S Hugo Jasper
> S Laura Helena
> S Jasper Maria
> S Laura Elias
> S Helena Sofia
> P Hugo

输出

Hugo
..Laura
....Helena
......Sofia
....Elias
..Jasper
....Maria

我已经有了将 Hugo 和 Laura 拆分为变量的拆分函数。但是我应该如何通过地图容器实现输出类型的结果。我应该在地图中的地图中使用某种递归或地图,这对我来说听起来很奇怪(无尽的地图)。 提前致谢。

【问题讨论】:

  • 通常我们会做相反的事情——通过树实现地图。就目前而言,您的问题并不清楚。
  • 您想为此使用地图的原因是什么?
  • 我只能使用地图或矢量或两者兼而有之。任务是练习 STL 容器。
  • 这仍然不能澄清你的问题。你在做一棵2-3树吗?二叉搜索树?红黑树?到目前为止你写了哪些代码,你在哪里卡住了?
  • 还没有代码,我只是在集思广益,以实现如图所示的输出。这就是为什么我要问如何使用 map 实现输出。或者我应该使用什么?如果我使用地图,例如:std::map<std::string,std::string> Store; Store["Hugo"]="Laura" 但是我怎样才能将 Laura 与 Helena 等配对。

标签: c++ dictionary tree


【解决方案1】:

这是一种可能的解决方案,使用multimap。您不必复制它,但可以随意使用它作为示例来制作自己的。 Multimap 允许有重复的键,您可以使用equal_range 方法查询这些键。通过使用映射值作为下一个节点并结合递归函数可以产生所需的确切结果:

#include <iostream>
#include <string>
#include <map>

void explore (std::multimap<std::string, std::string> const &tree, std::string const &key, int level) 
{
    level+=2;
    auto range = tree.equal_range(key);
    for (auto it = range.first; it != range.second; ++it)
    {
        std::cout << std::string(level, '.') << it->second << std::endl;
        explore(tree, it->second, level);
    }
}

int main()
{
    std::multimap<std::string, std::string> tree = 
    {
        { "Hugo", "Laura" },
        { "Hugo", "Jasper" },
        { "Laura", "Helena" },
        { "Jasper", "Maria" },
        { "Laura", "Elias" },
        { "Helena", "Sofia" }
    };

    std::string root = "Hugo";
    std::cout << root << std::endl;
    explore(tree, root, 0);

    return 0;
}

https://ideone.com/HywQo9

【讨论】:

  • 谢谢,我会试试的。之前没用过multimap,主要区别是什么?
  • 同样在同一个任务中,我需要打印 Hugos“子类别”的 int 值,总共 6 个,最长的“节点链接”是 4 个。
  • std::map 键是唯一的 std::multimap 可能有重复的键。至于其他任务,数据就在那里,你只需要调整它并打印它。
  • 是的。谢谢,帮了大忙!
猜你喜欢
  • 2015-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-08
  • 2016-10-27
  • 1970-01-01
相关资源
最近更新 更多