递归的STL Map

5
我正在尝试创建一个映射树(或者只是让一个映射的值指向另一个映射),但我不太确定如何着手。我找到了一个相关的讨论:http://bytes.com/topic/c/answers/131310-how-build-recursive-map,但我有点困惑那里发生了什么。
例如,我的键是一个字符,我的值是下一个映射。这是假设声明:
map< char, map< char, map< char.......>>>>>>>>>> root_map;

2
你有问题吗? - ereOn
1
基本上你正在做错事情,或者你的问题解决方法可能有问题。请先解释一下你的问题陈述,然后说明你解决问题的方法。 - user90150
在你所提到的讨论中,他们通过禁用编译器进行的类型检查来“解决”问题。他们告诉编译器每个映射都存储一个指向未知类型的指针作为值,只有程序员知道它应该是指向另一个映射的指针。 - Bart van Ingen Schenau
不幸的是,C++目前不允许在通用类型定义中进行无限递归,尽管我认为它应该可以。我一直在寻找这个功能。但是,您可以创建一个指向其他对象的指针映射(可以无限递归地映射到其他对象),并使用RTTI来检查它实际上是什么。 - mo FEAR
1
请查看此链接(https://dev59.com/KHENtIcB2Jgan1zn4yYu),它可能与此相关。 - mo FEAR
显示剩余2条评论
4个回答

2

是的,您可以这样做。然而,为了让地图有用,您需要使用方法(在这种情况下是Set和Get)来装饰它。

#include <map>
#include <iostream>

class Clever : public std::map <int, Clever>
{
  public:
    Clever & Set (int i) { m_i = i; return *this; }
    int Get (void) { return m_i; }

  private:
    int m_i;
};

int main (void)
{
  Clever c;
  c[0][2][3].Set(5);

  std::cout << c[0][2][3].Get() << std::endl;

  return 0;
}

“是的,你可以。” - 在旧的STL实现中可能不行。Clever是一个不完整的类型吗?我正在阅读这个答案和一篇旧文章 - MatG

2
也许您正在考虑类似以下内容的事情:

#include <iostream>
#include <map>

template <typename Key, typename Value>
struct Tree
{
    typedef std::map<Key, Tree> Children;

    Tree& operator=(const Value& value) { value_ = value; return *this; }

    Tree& operator[](const Key& key) { return children_[key]; }

    Children children_;
    Value value_;

    friend std::ostream& operator<<(std::ostream& os, const Tree& tree)
    {
        os << tree.value_ << " { ";
        for (typename Children::const_iterator i = tree.children_.begin();
                i != tree.children_.end(); ++i)
            os << i->first << " -> " << i->second << " | ";
        return os << '}';
    }
};

int main()
{
    Tree<int, std::string> t;
    t[1].children_[1] = "one,one";
    t[1].children_[9] = "one,nine";
    t[1] = "hmmm";
    std::cout << t << '\n';
}

我不太推荐这个。

2

我不太确定您想要实现什么,但是当我听到“地图树”时,我想到以下内容:

class NodeData
{
    // Some stuff...
};

class TreeNode
{
public:
    NodeData* data;
    std::map<char, TreeNode*> children;
};

这是我的最初方法,结果我又回到了这个方法。原来我只是链接它们的方式不对...谢谢! - thomast.sang

2
作为一个想法,就像这样:
struct CharMap {
    std::map<char,CharMap> map;
} root_map;

并像这样使用它

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

也许你可以在CharMap上添加更多的方法和运算符,这样就不需要在访问结构时使用.map了,从而使其更加精美。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接