返回信息流我的想法是
struct NODE{
string node_name;
vector<NODE> node_list;
}
之后想使用一个指针NODE*来指向某个节点并修改node_list
这样是否可行,这会导致什么问题吗?谢谢~[ema23]
这是一条镜像帖。来源:北邮人论坛 / cpp / #97358同步于 2018/4/6
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
【问题】一个多叉树节点结构如何定义?
soloist97
2018/4/6镜像同步11 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
好吧,其实这样也没啥问题。但是用指针的话可以释放自己,你这样要回到父节点才能释放
【 在 soloist97 的大作中提到: 】
: 能提示一下会导致什么问题吗?
会导致一个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 的大作中提到: 】
: 能提示一下会导致什么问题吗?
非常感谢!我稍稍大概明白了。使用shared_ptr会不会更好?还有我在VS里使用vector<NODE>似乎也可以,C里需要写明struct吧,C++似乎不用?
【 在 Nroskill 的大作中提到: 】
: 会导致一个Node A插入到另一个Node B中的时候,需要拷贝构造Node A再析构Node A
: 另外你的这种写法是不正确的,应该是vector<struct Node>
:
: 另外不太同意
: .........
发自「贵邮」
个人觉得性能上完全一样,share_ptr当然比原生指针安全且方便,就是有点丑而且需要cpp11支持,这个东西好不好我觉得完全看项目里面主要喜欢哪种风格,跟项目整体保持统一当然是最好的,尤其是cpp11的move语义,感觉用的项目还真不多。
没有struct我刚刚试了一下居然还真可以,之前一直以为只能靠typedef或者class实现,不过我不确定这个是否是标准支持的,懒得读了……
【 在 soloist97 的大作中提到: 】
: 非常感谢!我稍稍大概明白了。使用shared_ptr会不会更好?还有我在VS里使用vector<NODE>似乎也可以,C里需要写明struct吧,C++似乎不用?
:
: 发自「贵邮」
这是C with STL
【 在 Nroskill 的大作中提到: 】
: 会导致一个Node A插入到另一个Node B中的时候,需要拷贝构造Node A再析构Node A
: 另外你的这种写法是不正确的,应该是vector<struct Node>
: 另外不太同意二楼@chenxiansf 的改法(没有人身攻击的意思),个人觉得这种改法是典型的C with class的写法,正确的实现方式应为
: ...................