从地图构建一个n-ary树

时间:2015-06-15 17:52:01

标签: c++ tree stdmap tree-traversal

我正在尝试用地图构建一棵树,用基类和原始类来显示一个类层次结构。一个节点可以有多个子节点和子子节点

这是我的代码:

std::map<std::string, std::string> myClassMap; // 1. String (key) = Classname, 2. String = BaseClass


myClassMap.insert ( std::pair<std::string, std::string>("DerivedClass1", "OverallBaseClass"));
myClassMap.insert ( std::pair<std::string, std::string>("DerivedClass2", "OverallBaseClass"));
myClassMap.insert ( std::pair<std::string, std::string>("DerivedClass3", "OverallBaseClass") );
myClassMap.insert ( std::pair<std::string, std::string>("DerivedClass2-1'","DerivedClass2") );
myClassMap.insert ( std::pair<std::string, std::string>("DerivedClass2-1-1","DerivedClass2-1") );
myClassMap.insert ( std::pair<std::string, std::string>("DerivedClass2-1-2","DerivedClass2-1") );
myClassMap.insert ( std::pair<std::string, std::string>("DerivedClass2-2","DerivedClass2") );


  //and so on

我有一个方法:

void addTreeChild(QTreeWidgetItem *parent, std::string keyClassName)
{

    QTreeWidgetItem *treeItem = new QTreeWidgetItem();
    treeItem->setText(0, QString(keyClassName));
    parent->addChild(treeItem);

}

我可以调用并将子项添加到树中。 现在我的问题是,如何通过地图迭代,并将子项添加到我的树中,因此它出现了一个类层次结构

1 个答案:

答案 0 :(得分:0)

首先要记住字符串需要双引号 - 而不是单引号。

您可能需要多个地图而不是地图,因为您多次使用相同的密钥(在地图中无法完成)。

你可以像这样迭代:

for (auto i : myClassMap)
{
    // i.first now holds the first string (key)
    // i.second now holds the second string (value)
}

类似于:

    std::multimap<std::string, std::string> myClassMap;
    myClassMap.insert ( std::pair<std::string, std::string>("OverallBaseClass", "DerivedClass1"));
    myClassMap.insert ( std::pair<std::string, std::string>("OverallBaseClass", "DerivedClass2"));
    myClassMap.insert ( std::pair<std::string, std::string>("DerivedClass2", "DerivedClass3") );
    for (auto i : myClassMap)
    {
        cout << i.first << "," << i.second << endl;
    }

将产生:

DerivedClass2,DerivedClass3

OverallBaseClass,DerivedClass1

OverallBaseClass,DerivedClass2