假设我有一个我将调用NamedNestedMap的类型
std::map<std::string, std::map<std::string, NamedNestedMap> >
Run Code Online (Sandbox Code Playgroud)
在这种情况下,该对的每个秒(值)与父对象的类型或类型相同.我无法弄清楚的是如何宣布它.这将允许递归算法通过地图的"树"向下走.
Value类型与父类型相同,在我需要引用它的时候,它没有完全声明.
你怎么声明像这样嵌套的东西......
我甚至无法键入第一个,因此我可以将它包含在第二个因为它不完整
递归会在地图中查找某些内容,当它找到它时,会递归该对象的值.算法部分看起来很简单,声明部分就是这里的难点.我不是要迭代地图的地图,只需使用map.find,recurse并再次使用map.find.
你必须使用指针(当然,否则递归永远不会终止 - 你总是需要一个空的地图):
struct NestedMap;
struct NestedMap : std::map<std::string, NestedMap*> {};
Run Code Online (Sandbox Code Playgroud)
当然,您可能希望使用shared_ptr或类似的东西来管理内存,而不是原始指针.
创建表示节点的结构.
struct Node {
std::map<std::string, Node *> children;
};
Run Code Online (Sandbox Code Playgroud)
当然,您可以将其设为一个类并隐藏数据等.
我猜你想要一个深度为 n 的嵌套映射:
template<class key_type, class val_type, int nest_depth>
struct nest
{
typedef std::map<key_type, typename nest<key_type, val_type,
nest_depth-1>::map_type> map_type;
};
template<class key_type, class val_type>
struct nest<key_type, val_type, 0>
{
typedef std::map<key_type, val_type> map_type;
};
Run Code Online (Sandbox Code Playgroud)
像这样使用它:
nest<std::string, std::string, 2> nested_map;
Run Code Online (Sandbox Code Playgroud)