C - 用MAP创建树的创建树

C++ - Create Tree rekursively with map

本文关键字:创建 MAP      更新时间:2023-10-16

我想创建一个树,每个节点代表一个单个charakter,叶子节点表示由chars创建的字符串,该字符串导致该叶子节点。我的方法(也许班级名称有点误导,这只是一个快速的原型,foo是基类,bar是一个节点,而野蛮的叶子节点):

class Foo{
public:
    virtual void print() = 0;
};
class BarBar : public Foo {
public:
    BarBar(int mData) : data(mData){};
    int data;
    void print(){
        cout << data << endl;
    }
};
class Bar : public Foo {
public:
    map<char,Foo*> ptr;
    void insert(char c, Foo* f){
        ptr.insert(pair<char,Foo*>(c,f));
    }
    void procStr(char* str, int dat){
        if(str[0] != ''){
            Bar b;
            insert(str[0],b); //error "Invalid arguments 'Candidates are:void insert(char, Foo *)'"
            str++;
            b.procStr(str,dat);
        } else {
            BarBar bar(dat);
            insert('^',bar); //error "Invalid arguments 'Candidates are:void insert(char, Foo *)'"
        }
    }
    void print(){
        for (auto& kv : ptr){
            cout << kv.first << endl;
            kv.second->print();
        }
    }
}
int main(){
    Bar root;
    root.procStr("Hello",42);
    root.print();
    return 0;
}

我的预期输出将是:

H
e
l
l
o

,但我得到了:

H
Ä

和程序崩溃。

程序崩溃在:

Foo& res = kv.second;
res.print(); //<<-- Program crashes
BarBar bar(dat);
            insert('^',bar); //error "Invalid arguments 'Candidates are:void insert(char, Foo *)'"

您的函数需要一个foo*,但是您正在传递一个实例(仍然是本地实例,因此即使您通过了bar,在您使用时,它也会无效)。

地图实际上不是这个问题的正确结构,请查找订单统计树,它们提供订购而无需排序,这是您在这里之后。也就是说,OS树可以像'H',o'一样容易存储" O"," H"。