如何在C++中整理树数据结构的前向引用
How to sort out forward references for a tree data structure in C++
在C++11中,我想定义一个树数据结构,其中每个节点都有一组键(std::string
(,每个键都与两个值相关联:另一个std::string
,以及指向树中子节点的指针。 这样做的自然方法似乎是使一个节点成为一个std::unordered_map
,具有std::string
键和值,这些值是std::string
的std::pair
和指向子节点的指针。 目前,我有这个:
struct tree_node;
typedef std::pair<std::string, tree_node *> tree_value;
struct tree_node {
std::unordered_map<std::string, tree_value> key_val_map;
};
令人讨厌的是这一切中间的struct
;当我使用这些数据结构时,我不得不不断通过key_val_map
迈出额外的一步。 我希望tree_node
简单地被typedef
为有问题的std::unordered_map。 这似乎是可能的,因为tree_value
仅指指针tree_node
;我应该能够以某种方式向前声明tree_node
以便我可以定义tree_value
. 不过,我找不到这样做的方法。
一种尝试是单独在一行中键入 typedef tree_node
:
typedef std::unordered_map<std::string, std::pair<std::string, tree_node *>> tree_node;
但是,当它命中声明中的tree_node *
时,会给出错误"Expected a type";typedef
尚未发生,因此编译器不知道tree_node
是什么。 很公平。 我也试图模糊地向前声明tree_node
,因为在我看来,当我只通过指针引用它时,编译器不需要有关于它的完整信息:
class tree_node;
typedef std::pair<std::string, tree_node *> tree_value;
typedef std::unordered_map<std::string, tree_value> tree_node;
但这会在最后一行给出错误"使用不同类型的 Typedef 重新定义"。
当然有一种方法可以整理出这罐蠕虫。 如果我可以在tree_node
将unordered_map
包裹在struct
内时使其工作,为什么当我摆脱了毫无意义的单成员struct
时,我不能让它工作? 我基本上只是想让它struct
"透明"——我不想在我的代码中继续引用key_val_map
。 有办法吗?
如果改为将tree_value
声明为结构,则tree_node
可以是类型别名。
struct tree_value;
using tree_node = std::unordered_map<std::string, tree_value>;
struct tree_value
{
std::string data;
tree_node * child; // or std::unique_ptr<tree_node> ?
};
作为奖励,我们有比first
和second
更有意义的名称。
你可以从地图派生tree_node
:
struct tree_node : std::unordered_map<std::string, tree_value> {
using std::unordered_map<std::string, tree_value>::unordered_map;
};
- 链表,反向函数,数据结构
- 如何使用set实现无序数据结构?
- 我们可以将数据永久保存为数据结构吗?
- C++中的可变长度数组/数据结构
- 用于存储由空格分隔的字符串的 C++/C 数据结构
- 通过 NIF 从C++返回自定义数据结构
- 编译器上的策略数据结构不起作用
- 尝试构建"lock-free"数据结构C++
- 设计将引用元素移动到开头的数据结构.C++
- 在学习数据结构之前对STL有一个了解是好的吗?
- 如何解析表示树状数据结构的字符串
- 我对数据结构、双向链表有一些问题
- 如何在C++中整理树数据结构的前向引用
- 在C++中,是否可以引用像C++中的stl列表这样的数据结构部分
- STL表示隐含交叉引用的数据结构的方法
- STL中使用引用计数的数据结构存在哪些行为异常
- 设置数据结构引用
- STL如何用非线性数据结构实现反向迭代器去引用
- 错误 C2280.尝试引用已删除的函数.尝试从其数据结构中删除敌人和激光时出现此错误
- 如何在结构数据结构中使用 map stl 并初始化映射,然后引用它