当前位置: 首页 > 知识库问答 >
问题:

如何在C++中创建递归嵌套hashmap?

孟俊发
2023-03-14
def recursiveDict():
   return collections.defaultdict(recursiveDict)

# I can create a dictionary like the following
dic = recursiveDict()
dic['a'] = 1
dic['a']['a'] = 1
dic['a']['a']['a'] = 1
dic['a']['a']['a']['a'] = 1
and so on....

在用Python和其他动态语言工作了4年之后,我又回到了用C++工作。我希望能够使用unordered_map或map类创建一个递归嵌套列表(如上面的Python代码所示)。

我找不到办法去做那件事。

我想要实现的是键应该是char/string类型的,但是要插入的值应该是int类型的。

请告诉我这是怎么做的。

我最接近的是这个

struct CharMap {
    std::unordered_map<char,CharMap> map;
} root_map;

and use it like

root_map.map['a'].map['b'];

但是我应该重载什么来获得上面的确切语法呢?

提前道谢。

共有1个答案

燕经国
2023-03-14

既然您澄清了您熟悉运算符重载的基本概念,那么我将勾画出一个您可以遵循的实现此语法的基本蓝图。

您的容器将实现一个operator[]重载,该重载返回一个helper对象。假设您的容器名为charmap,并且在完成了所有操作之后,您的容器存储ints。

class CharMap {

    struct key {

        key operator[](const std::string &);

        operator int();

        key &operator=(int n);
    };

public:

    key operator[](const std::string &);

};

例如,这将允许:

CharMap container;

container["A"]["B"]["C"]=5;

int n=container["D"]["E"]["F"};

charmap::operator[]返回帮助器对象。该对象还实现它自己的运算符[]重载,该重载返回另一个。最后,key对象实现一个operator=重载,以便您可以为它赋值,或者operatorint()重载从容器返回一个值。

很明显,将在内部存储一个指向其来源的charmap容器的指针,以便它可以更新或返回容器中的适当值。还在内部以零碎的方式跟踪用于创建它的所有键。charmap::key在内部记录第一个字符串。然后,它的键::operator[]返回另一个,该键在内部记录原始字符串和另一个字符串

一旦调用operator[]operatorint()中的任何一个,它们将使用所有累积的字符串来完成它们的工作,其形式或方式您需要弄清楚。

还有一些效率问题可能会得到解决,也可能不会得到解决。这种方法实现了您想要的语法,但是根据您的情况,它可能需要一些微调来优化底层实现,以消除大量的内部复制和重置。

此外,还需要一些额外的工作来实现正确的const-正确性。但所有这些都只是实现细节,这就是如何实现这种访问由多个字符串索引的容器的语法。

 类似资料:
  • 问题内容: 我正在尝试从JSON对象动态构建表单,该对象包含表单元素的嵌套组: 我一直在使用ng-switch块,但是它与嵌套项变得站不住脚,就像上面的Address对象一样。 这是小提琴:http : //jsfiddle.net/hairgamiMaster/dZ4Rg/ 关于如何最好地解决此嵌套问题的任何想法?非常感谢! 问题答案: 我认为这可以为您提供帮助。它来自我在Google网上论坛上

  • 问题内容: 我有一个方法必须执行以下操作: 我想指定嵌套的数量(在上述情况下,我希望嵌套15个)。这里有一种使用递归编程的方法吗? 问题答案: 是。这可以通过递归编程来执行。 我假设您不喜欢在源代码中写下这些嵌套的代码-如您的示例所示,因为这确实是丑陋的编程-如评论员所解释。 下面的代码(类似于Java的伪代码)对此进行了说明。我假设嵌套的深度固定。然后,您实际上想循环遍历尺寸深度的整数向量。 数

  • 问题内容: 我有2个CSV文件:“数据”和“映射”: ‘映射’文件有4列:,,,和。填充所有四个列。 “数据”文件具有这些相同的列,其中填充了列,而其他三列为空白。 我希望我的Python代码来打开这两个文件并为每个数据文件,它的映射,以及从映射文件中值。 我知道只有2列存在时才需要使用dict(需要映射1列),但是当需要映射3列时我不知道如何实现。 以下是我尝试完成的映射的代码: 它返回。 经过

  • 问题内容: 我将如何呈现一个带有嵌套项目的菜单,而该嵌套项目的子对象数量不明,如下面的示例所示,该对象的反应如何? 问题答案: Codesandbox示例 您只需要递归调用Menu组件,其子组件即可显示并作为数据道具传递。

  • 我的数据结构如下所示: Foo的每个实例都可以包含任意数量的S,这当然反过来又可以包含更多的S等等。那么,我该如何让FreeMarker通过这样的列表呢?

  • 问题内容: 说我要制作以下JSON 目前,这就是我实现的方式 似乎应该有一个更好的方法来做到这一点,而不是做更多的事情,然后将它们放置在主体中。有比我正在使用的方法更好的动态构建方法吗? 在此先感谢您的帮助! 问题答案: 如果您处理大量JSON数据,我真的建议您使用Gson或Jackson。这要方便得多,并且两个库都很好地支持与Java对象之间的相互转换(与通过JSONObjects手动构建JSO