提问者:小点点

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


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个答案

匿名用户

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

您的容器将实现一个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-正确性。但所有这些都只是实现细节,这就是如何实现这种访问由多个字符串索引的容器的语法。

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(何在|c++|中|创建|递归|嵌套|hashmap)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?