C - 用MAP创建树的创建树
C++ - Create Tree rekursively with map
我想创建一个树,每个节点代表一个单个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"。
相关文章:
- C++如何创建 std::map
- std::map:当元素不可默认构造时创建/替换元素
- 如何创建一个模板化函数,可以在任何具有字符串键的 std::map 上运行?
- 创建可以遍历 std::map 值的通用模板迭代器的最简单方法是什么?
- 创建一个变体类和 std::map<变体,变体>
- 当 map 是一个整数数组并且由 operator[] 创建时,它是否初始化其映射类型
- std::map<int, A> 运算符 [] 需要使用空构造函数创建 A
- 如何在C++中创建将函数与参数相关联的 Map?
- 动态创建一个继承的类,使用STD :: MAP使用基类指针访问
- 为 map<int、pair<int、int 创建比较器>>
- C++填充一个std::map创建不必要的对象
- 如何创建一个以键为输入并在C++std:map中查找值的模板函数
- 为 map<T1、T2> 迭代器创建模板函数
- 从C 中的MAP的随机子集创建新地图
- 为什么map使用运算符[]创建新条目
- 如何在 c++ 中创建 map<string, class::method>
- 用于从 std::map 的最后 n 个元素创建 std::vector 的惯用C++
- 如何在c++中高效地创建map中的map
- 如何创建一个std::map的常数值,它仍然可以被[]操作符访问
- 不创建临时值的Std::map插入