C ++ - 用map重新创建Tree

时间:2017-12-08 17:22:42

标签: c++ tree

我想创建一个树,其中每个节点代表一个字符串,叶节点表示由字符创建的字符串,该字符串通向此叶节点。我的方法(也许类名有点误导,这只是一个快速原型,Foo是基类,Bar是节点,BarBar是叶节点):

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] != '\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

1 个答案:

答案 0 :(得分:0)

BarBar bar(dat);

            insert('^',bar); //error "Invalid arguments 'Candidates are:void insert(char, Foo *)'"

你的函数需要一个Foo *,但你传递的是一个实例(当时仍然是一个本地实例,所以即使你通过了&amp; bar,它在你使用它时也会无效。)

地图确实不是这个问题的正确结构,查找订单统计树,它们提供排序而不进行排序,这就是你在此之后所做的。也就是说,OS树可以存储&#39;&#39; h&#39;就像&#39; h&#39;,&#39; o&#39;。