BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #97358同步于 2018/4/6
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

【问题】一个多叉树节点结构如何定义?

soloist97
2018/4/6镜像同步11 回复
我的想法是 struct NODE{ string node_name; vector<NODE> node_list; } 之后想使用一个指针NODE*来指向某个节点并修改node_list 这样是否可行,这会导致什么问题吗?谢谢~[ema23]
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
chenxiansf机器人#1 · 2018/4/6
不能这么定义,vector<Node*>
soloist97机器人#2 · 2018/4/6
能提示一下会导致什么问题吗? 【 在 chenxiansf 的大作中提到: 】 : 不能这么定义,vector<Node*>
chenxiansf机器人#3 · 2018/4/6
好吧,其实这样也没啥问题。但是用指针的话可以释放自己,你这样要回到父节点才能释放 【 在 soloist97 的大作中提到: 】 : 能提示一下会导致什么问题吗?
Nroskill机器人#4 · 2018/4/6
会导致一个Node A插入到另一个Node B中的时候,需要拷贝构造Node A再析构Node A 另外你的这种写法是不正确的,应该是vector<struct Node> 另外不太同意二楼@chenxiansf 的改法(没有人身攻击的意思),个人觉得这种改法是典型的C with class的写法,正确的实现方式应为 ```cpp template<class T> class Node { T val; list<unique_ptr<Node<T>>> node_list; }; ``` 当然,如果你更大佬一些,也可以写的好看一点,不用unique_ptr ```cpp template<class T> class Node { public: T val; list<Node<T>> node_list; }; ``` 但这样看起来就与你一开始的写法差不多了,然而实际上并不是这样,你需要加上cpp11的move特性 ```cpp template<class T> class Node { public: T val; list<Node<T>> node_list; Node<T>(): val(T()), node_list(list<Node<T>>()) {} Node<T>(Node<T>&& arg): val(move(arg.val)), node_list(move(arg.node_list)) {} Node<T>& operator=(Node<T>&& other) { val = move(other.val); node_list = move(other.node_list); return *this; } }; ``` 当然这样调用起来相比unique_ptr的版本也稍微麻烦一些 ```cpp Node<string> a; Node<string> b; a.node_list.push_back(move(b)); ``` 【 在 soloist97 的大作中提到: 】 : 能提示一下会导致什么问题吗?
soloist97机器人#5 · 2018/4/6
非常感谢!我稍稍大概明白了。使用shared_ptr会不会更好?还有我在VS里使用vector<NODE>似乎也可以,C里需要写明struct吧,C++似乎不用? 【 在 Nroskill 的大作中提到: 】 : 会导致一个Node A插入到另一个Node B中的时候,需要拷贝构造Node A再析构Node A : 另外你的这种写法是不正确的,应该是vector<struct Node> : : 另外不太同意 : ......... 发自「贵邮」
Nroskill机器人#6 · 2018/4/6
个人觉得性能上完全一样,share_ptr当然比原生指针安全且方便,就是有点丑而且需要cpp11支持,这个东西好不好我觉得完全看项目里面主要喜欢哪种风格,跟项目整体保持统一当然是最好的,尤其是cpp11的move语义,感觉用的项目还真不多。 没有struct我刚刚试了一下居然还真可以,之前一直以为只能靠typedef或者class实现,不过我不确定这个是否是标准支持的,懒得读了…… 【 在 soloist97 的大作中提到: 】 : 非常感谢!我稍稍大概明白了。使用shared_ptr会不会更好?还有我在VS里使用vector<NODE>似乎也可以,C里需要写明struct吧,C++似乎不用? : : 发自「贵邮」
chenxiansf机器人#7 · 2018/4/6
这是C with STL 【 在 Nroskill 的大作中提到: 】 : 会导致一个Node A插入到另一个Node B中的时候,需要拷贝构造Node A再析构Node A : 另外你的这种写法是不正确的,应该是vector<struct Node> : 另外不太同意二楼@chenxiansf 的改法(没有人身攻击的意思),个人觉得这种改法是典型的C with class的写法,正确的实现方式应为 : ...................
Nroskill机器人#8 · 2018/4/6
离真正的cpp还差啥,继承和多态嘛? 【 在 chenxiansf 的大作中提到: 】 : 这是C with STL
nuanyangyang机器人#9 · 2018/4/8
好像还真不是问题。你试试。只不过这已经不是个节点了,而是整个子树。