【发布时间】:2020-07-27 05:50:18
【问题描述】:
我想创建一个树状结构,但基于 unordered_map 的主题。简而言之,我想创建一个主题树,我想到了这种方法:
typedef struct topic_tree {
int id;
unordered_map<string, struct topic_tree *> children;
} topic_tree;
这听起来是个好主意,因为对于每个“主题”,我都会有一个 ID(或任何我需要的),并且从每个节点都会有一个从下一个字符串到下一个 topic_tree 的映射,并且以此类推。
我尝试创建这棵树:first/second/third。这意味着首先它是第二个的父级,第二个是第三个的父级.. 可能还有其他类似first/forth/fifty
这意味着第一个现在有两个孩子,第二个和第四个......这就是解释。现在让我们解决问题:
例如我这样声明:
topic_tree *root = (topic_tree *)malloc(sizeof(struct topic_tree));
root->id = -1;
topic_tree *x = (topic_tree *)malloc(sizeof(struct topic_tree));
x->id = 5;
root->children["first"]=x;
但是这个:root->children["first"] = x; 给了我一个Floating point exception,我不知道为什么..
【问题讨论】:
-
topic_tree *root = (topic_tree *)malloc(sizeof(struct topic_tree));-- 你为什么在 C++ 程序中使用malloc?这是完全错误的。 C++ 不是 C。 -
打开你的 C++ 书籍到解释如何使用
new和delete的章节并阅读它。我很好奇:在不知道new和delete的情况下,您究竟是如何了解std::unordered_maps 和其他高级C++ 库容器的?哪本 C++ 教科书把你直接扔进了容器,没有讲授动态内存分配的基础知识? -
理想情况下,如果可以的话,完全避免手动分配内存。考虑改用
unordered_map<std::string, topic_tree>。此外,您对结构使用typedef是一种 C 主义,在 C++ 中不是必需的。 -
没有。
new返回一个指向新对象的指针。我的印象是你是一个 C 程序员,他的印象是 C++“足够接近”。那不是真的。 C++ 具有 C 没有的类型类别,即非 POD 类型。你不能乱扔malloc、memcpy,或者它们上面的任何低级C函数。 -
你不能指望没有教科书就学习 C++,对不起。 C++ 是当今使用的最复杂的通用编程语言。我已经使用 C++ 超过 20 年了,而且我还在学习。如“今天”。这只是事实。如果您尝试将随机 Google 搜索和 Youtube 视频中的一些 C++ 知识拼接在一起,您只会感到困惑。我不能给你一个链接,因为不存在这样的链接。没有任何链接会影响您获得大量 C++ 知识,这只能来自教科书,以及正式、严谨的研究。
标签: c++ stl floating-point unordered-map