嵌套的std :: maps

boa*_*der 4 c++ stl

假设我有一个我将调用NamedNestedMap的类型

std::map<std::string, std::map<std::string, NamedNestedMap> >
Run Code Online (Sandbox Code Playgroud)

在这种情况下,该对的每个秒(值)与父对象的类型或类型相同.我无法弄清楚的是如何宣布它.这将允许递归算法通过地图的"树"向下走.

Value类型与父类型相同,在我需要引用它的时候,它没有完全声明.

你怎么声明像这样嵌套的东西......

我甚至无法键入第一个,因此我可以将它包含在第二个因为它不完整

递归会在地图中查找某些内容,当它找到它时,会递归该对象的值.算法部分看起来很简单,声明部分就是这里的难点.我不是要迭代地图的地图,只需使用map.find,recurse并再次使用map.find.

Pav*_*aev 8

你必须使用指针(当然,否则递归永远不会终止 - 你总是需要一个空的地图):

struct NestedMap;
struct NestedMap : std::map<std::string, NestedMap*> {};
Run Code Online (Sandbox Code Playgroud)

当然,您可能希望使用shared_ptr或类似的东西来管理内存,而不是原始指针.

  • 这本身并不坏.问题是STL类没有虚拟析构函数,因此您不能以多态方式使用此类继承类(如果通过指向base的指针删除,则会执行错误的析构函数).只要你不尝试使用多态,它就完全没问题了. (5认同)
  • 据我所知,继承STL课程是一件坏事. (3认同)

str*_*ger 5

创建表示节点的结构.

struct Node {
    std::map<std::string, Node *> children;
};
Run Code Online (Sandbox Code Playgroud)

当然,您可以将其设为一个类并隐藏数据等.


Geo*_*che 5

我猜你想要一个深度为 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)