我正在尝试制作地图树(或者只是将地图的值指向另一个地图),但我不太确定如何处理这个问题。我找到了关于这个问题的讨论:http://bytes.com/topic/c/answers/131310-how-build-recursive-map但我对那里发生的事情感到有点困惑。
例如,我的键是一个char,我的值是下一个地图。这是假设的声明:
map< char, map< char, map< char.......>>>>>>>>>> root_map;
答案 0 :(得分: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';
}
我不会真的推荐它。
答案 1 :(得分:2)
作为想法,这样的事情:
struct CharMap {
std::map<char,CharMap> map;
} root_map;
并像
一样使用它root_map.map['a'].map['b'];
可能你可以通过CharMap上的其他方法和操作符来更加花哨,这些方法和操作符在访问你的结构时会消除 .map 的需要。
答案 2 :(得分:1)
我不确定你想要达到什么目标,但当我听到“地图树”时,我会想到以下几点:
class NodeData
{
// Some stuff...
};
class TreeNode
{
public:
NodeData* data;
std::map<char, TreeNode*> children;
};
答案 3 :(得分:1)
是的,你可以。为了让地图做任何有用的事情,你将不得不用方法(在这种情况下,设置和获取)来装饰它。
#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;
}