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'];
但是我应该重载什么来获得上面的确切语法呢?
提前道谢。
既然您澄清了您熟悉运算符重载的基本概念,那么我将勾画出一个您可以遵循的实现此语法的基本蓝图。
您的容器将实现一个operator[]
重载,该重载返回一个helper对象。假设您的容器名为charmap
,并且在完成了所有操作之后,您的容器存储int
s。
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
-正确性。但所有这些都只是实现细节,这就是如何实现这种访问由多个字符串索引的容器的语法。